AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Passwortsicherheit II (Delphi 2009)
Thema durchsuchen
Ansicht
Themen-Optionen

Passwortsicherheit II (Delphi 2009)

Ein Thema von xZise · begonnen am 1. Feb 2009 · letzter Beitrag vom 1. Feb 2009
Antwort Antwort
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

Passwortsicherheit II (Delphi 2009)

  Alt 1. Feb 2009, 11:49
negaHs ( ) Passwortsicherheit arbeitet noch mit Ansistrings. Für Unicode muss das ganze verbreitert werden. Außerdem kann es da Bereichsüberprüfungsfehler geben, weshalb ich das jetzt mit Delphi 2009 bzw. Unicodestring kompatibel gemacht habe:
Delphi-Quellcode:
function PassphraseQuality(const Password : string): Extended;
// returns computed Quality in range 0.0 to 1.0
// source extracted from Delphi Encryption Compendium, DEC
// Convert to Delphi 2009 by Fabian (Nickname: xZise)

  function Diff(const AWord1, AWord2 : Word) : Word; overload;
  begin
    if AWord1 > AWord2 then
      Result := AWord1 - AWord2
    else
      Result := AWord2 - AWord1;
  end;

  function Diff(const AByte1, AByte2 : Byte) : Byte; overload;
  begin
    if AByte1 > AByte2 then
      Result := AByte1 - AByte2
    else
      Result := AByte2 - AByte1;
  end;

  {$IFDEF Unicode}
  function Entropy(P: PWordArray; L: Integer): Extended;
  {$ELSE}
  function Entropy(P: PByteArray; L: Integer): Extended;
  {$ENDIF}
  var
    Freq: Extended;
    I: Integer;
    {$IFDEF Unicode}
    Accu: array [Word] of LongWord;
    {$ELSE}
    Accu: array [Byte] of LongWord;
    {$ENDIF}
  begin
    Result := 0.0;
    if L <= 0 then Exit;
    FillChar(Accu, SizeOf(Accu), 0);
    for I := 0 to L-1 do Inc(Accu[P[I]]);
    for I := 0 to High(Accu) do
      if Accu[I] <> 0 then
      begin
        Freq := Accu[I] / L;
        Result := Result - Freq * (Ln(Freq) / Ln(2));
      end;
  end;

  function Differency: Extended;
  var
    S: string;
    L,I: Integer;
  begin
    Result := 0.0;
    L := Length(Password);
    if L <= 1 then Exit;
    SetLength(S, L-1);
    for I := 2 to L do
    begin
      {$IFDEF Unicode}
      Word(S[I-1]) := Diff(Word(Password[I-1]), Word(Password[I]));
      {$ELSE}
      Byte(S[I-1]) := Diff(Byte(Password[I-1]), Byte(Password[I]));
      {$ENDIF}
    end;

    Result := Entropy(Pointer(S), Length(S));
  end;

  function KeyDiff: Extended;
  const
    TableDE = '^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=?`QWERTZUIOPÜ*ASDFGHJKLÖÄ''>YXCVBNM;:_';
  var
    S: string;
    L,I,J: Integer;
  begin
    Result := 0.0;
    L := Length(Password);
    if L <= 1 then Exit;
    S := Password;
    UniqueString(S);
    for I := 1 to L do
    begin
      J := Pos(S[I], TableDE);
      if J > 0 then S[I] := Char(J);
    end;
    for I := 2 to L do
    begin
      {$IFDEF Unicode}
      Word(S[I-1]) := Diff(Word(S[I-1]), Word(S[I]));
      {$ELSE}
      Byte(S[I-1]) := Diff(Byte(S[I-1]), Byte(S[I]));
      {$ENDIF}
    end;
    Result := Entropy(Pointer(S), L-1);
  end;

const
  GoodLength = 10.0; // good length of Passphrases
var
  L: Extended;
begin
  Result := Entropy(Pointer(Password), Length(Password));
  if Result <> 0 then
  begin
    Result := Result * (Ln(Length(Password)) / Ln(GoodLength));
    L := KeyDiff + Differency;
    if L <> 0 then L := L / 64;
    Result := Result * L;
    if Result < 0 then Result := -Result;
    if Result > 1 then Result := 1;
  end;
end;
Ansonsten sollte sie genauso arbeiten wie die von negaH. Und vielleicht sollte man statt einen Compilerschalter das überladen lassen?

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Passwortsicherheit II (Delphi 2009)

  Alt 1. Feb 2009, 12:19
Zitat von xZise:
Und vielleicht sollte man statt einen Compilerschalter das überladen lassen?
Oder

{$IF Declared(RTLVersion) and (RTLVersion >= 20.0)} verwenden, ab Delphi 6 (oder auch früher?).
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Passwortsicherheit II (Delphi 2009)

  Alt 1. Feb 2009, 12:29
Zitat von mjustin:
{$IF Declared(RTLVersion) and (RTLVersion >= 20.0)}
es ist nicht gesagt, daß alle zukünftigen Delphi-Versioen auf Unicode laufen
und voallem was ist, wenn man 'nen Passwort im ANSI-Format in 'ner Unicode-Umgebung testen will?

Überladen wäre wohl praktischer
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Passwortsicherheit II (Delphi 2009)

  Alt 1. Feb 2009, 12:45
Aber damit wird das so riesig:
Delphi-Quellcode:
function PassphraseQuality(const Password : string): Extended; overload;
// returns computed Quality in range 0.0 to 1.0
// source extracted from Delphi Encryption Compendium, DEC
// Convert to Delphi 2009 by Fabian (Nickname: xZise)

  function Diff(const AWord1, AWord2 : Word) : Word; overload;
  begin
    if AWord1 > AWord2 then
      Result := AWord1 - AWord2
    else
      Result := AWord2 - AWord1;
  end;

  function Entropy(P: PWordArray; L: Integer): Extended;
  var
    Freq: Extended;
    I: Integer;
    Accu: array [Word] of LongWord;
  begin
    Result := 0.0;
    if L <= 0 then Exit;
    FillChar(Accu, SizeOf(Accu), 0);
    for I := 0 to L-1 do Inc(Accu[P[I]]);
    for I := 0 to High(Accu) do
      if Accu[I] <> 0 then
      begin
        Freq := Accu[I] / L;
        Result := Result - Freq * (Ln(Freq) / Ln(2));
      end;
  end;

  function Differency: Extended;
  var
    S: string;
    L,I: Integer;
  begin
    Result := 0.0;
    L := Length(Password);
    if L <= 1 then Exit;
    SetLength(S, L-1);
    for I := 2 to L do
    begin
      Word(S[I-1]) := Diff(Word(Password[I-1]), Word(Password[I]));
    end;

    Result := Entropy(Pointer(S), Length(S));
  end;

  function KeyDiff: Extended;
  const
    TableDE = '^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=?`QWERTZUIOPÜ*ASDFGHJKLÖÄ''>YXCVBNM;:_';
  var
    S: string;
    L,I,J: Integer;
  begin
    Result := 0.0;
    L := Length(Password);
    if L <= 1 then Exit;
    S := Password;
    UniqueString(S);
    for I := 1 to L do
    begin
      J := Pos(S[I], TableDE);
      if J > 0 then S[I] := Char(J);
    end;
    for I := 2 to L do
    begin
      Word(S[I-1]) := Diff(Word(S[I-1]), Word(S[I]));
    end;
    Result := Entropy(Pointer(S), L-1);
  end;

const
  GoodLength = 10.0; // good length of Passphrases
var
  L: Extended;
begin
  Result := Entropy(Pointer(Password), Length(Password));
  if Result <> 0 then
  begin
    Result := Result * (Ln(Length(Password)) / Ln(GoodLength));
    L := KeyDiff + Differency;
    if L <> 0 then L := L / 64;
    Result := Result * L;
    if Result < 0 then Result := -Result;
    if Result > 1 then Result := 1;
  end;
end;

function PassphraseQuality(const Password : AnsiString): Extended; overload;
// returns computed Quality in range 0.0 to 1.0
// source extracted from Delphi Encryption Compendium, DEC
// Convert to Delphi 2009 by Fabian (Nickname: xZise)

  function Diff(const AByte1, AByte2 : Byte) : Byte; overload;
  begin
    if AByte1 > AByte2 then
      Result := AByte1 - AByte2
    else
      Result := AByte2 - AByte1;
  end;

  function Entropy(P: PByteArray; L: Integer): Extended;
  var
    Freq: Extended;
    I: Integer;
    Accu: array [Byte] of LongWord;
  begin
    Result := 0.0;
    if L <= 0 then Exit;
    FillChar(Accu, SizeOf(Accu), 0);
    for I := 0 to L-1 do Inc(Accu[P[I]]);
    for I := 0 to High(Accu) do
      if Accu[I] <> 0 then
      begin
        Freq := Accu[I] / L;
        Result := Result - Freq * (Ln(Freq) / Ln(2));
      end;
  end;

  function Differency: Extended;
  var
    S: string;
    L,I: Integer;
  begin
    Result := 0.0;
    L := Length(Password);
    if L <= 1 then Exit;
    SetLength(S, L-1);
    for I := 2 to L do
    begin
      Byte(S[I-1]) := Diff(Byte(Password[I-1]), Byte(Password[I]));
    end;

    Result := Entropy(Pointer(S), Length(S));
  end;

  function KeyDiff: Extended;
  const
    TableDE = '^1234567890ß´qwertzuiopü+asdfghjklöä#<yxcvbnm,.-°!"§$%&/()=?`QWERTZUIOPÜ*ASDFGHJKLÖÄ''>YXCVBNM;:_';
  var
    S: string;
    L,I,J: Integer;
  begin
    Result := 0.0;
    L := Length(Password);
    if L <= 1 then Exit;
    S := Password;
    UniqueString(S);
    for I := 1 to L do
    begin
      J := Pos(S[I], TableDE);
      if J > 0 then S[I] := Char(J);
    end;
    for I := 2 to L do
    begin
      Byte(S[I-1]) := Diff(Byte(S[I-1]), Byte(S[I]));
    end;
    Result := Entropy(Pointer(S), L-1);
  end;

const
  GoodLength = 10.0; // good length of Passphrases
var
  L: Extended;
begin
  Result := Entropy(Pointer(Password), Length(Password));
  if Result <> 0 then
  begin
    Result := Result * (Ln(Length(Password)) / Ln(GoodLength));
    L := KeyDiff + Differency;
    if L <> 0 then L := L / 64;
    Result := Result * L;
    if Result < 0 then Result := -Result;
    if Result > 1 then Result := 1;
  end;
end;
MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Passwortsicherheit II (Delphi 2009)

  Alt 1. Feb 2009, 12:54
aber man könnte dann überall beides nutzen

Unicode in einem NichtUnicodeDelphi und ANSI in einem UnicodeDelphi

SP: String als Typ macht sich nicht gut ... in 'nem "alten" Delphi wäre Strin/AnsiString und läßt sich nicht mehr überarbeiten
und wenn jemand sein Delphi2009 auf ANSI umstellt ebenso

> WideString (und/oder seit D2009 UnicodeString)
$2B or not $2B
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Passwortsicherheit II (Delphi 2009)

  Alt 1. Feb 2009, 14:34
Zitat von himitsu:
SP: String als Typ macht sich nicht gut ... in 'nem "alten" Delphi wäre Strin/AnsiString und läßt sich nicht mehr überarbeiten
Genau, Delphi 6 sagt zu dieser Deklaration:

function PassphraseQuality(const Password : AnsiString): Extended; overload; [Fehler] Unit1.pas(112): Bezeichner redefiniert: 'PassphraseQuality'

da string = AnsiString

Weitere Fehler:

Word(S[I-1]) := Diff(Word(Password[I-1]), Word(Password[I])); [Fehler] Unit1.pas(65): Der linken Seite kann nichts zugewiesen werden
[Fehler] Unit1.pas(90): Der linken Seite kann nichts zugewiesen werden
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Passwortsicherheit II (Delphi 2009)

  Alt 1. Feb 2009, 14:53
Zitat:
Word(S[I-1]) := Diff(Word(Password[I-1]), Word(Password[I]));
Delphi-Quellcode:
// Convertierung auf andere Seite verlagern
// (es gibt zwar och 'nen Weg für die linke Seite,
// aber ich sollte lieber mal keine Pointer-Verrenkungen von mir geben ._. )
S[I-1] := WideChar(Diff(Word(Password[I-1]), Word(Password[I])));

// bzw für ANSI:
S[I-1] := AnsiChar(Diff(Byte(Password[I-1]), Byte(Password[I])));

// oder
function Diff(const AWord1, AWord2 : WideChar) : WideChar overload;
  begin
    if AWord1 > AWord2 then
      Result := WideChar(Word(AWord1) - Word(AWord2))
    else
      Result := WideChar(Word(AWord2) - Word(AWord1));
    // Result := WideChar(Word(Abs(Integer(Word(AWord1)) - Integer(Word(AWord2)))));
  end;

function Diff(const AWord1, AWord2 : AnsiChar) : AnsiChar overload;
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz