Als Aufarbeitung des letzten Stuttgarter Lazarus treffen und fürs neue bastle ich mir gerade einen Passwort Manager ( Demoprogram für Generische Klassen, Session Properties ..).
Klar das die eingegebenen Passwörter Verschlüsselt abgelegt werden müssen.
Nach etwas Recherche (eigentlich wollte ich die OpenSSL Lib einbinden) habe ich die blowfish.pp im FCL Verzeichnis gefunden. Wenn man es genau nimmt macht die alles was ich haben will und das auch noch Elegant.
Ein Blick auf die Wiki Page ( https://de.wikipedia.org/wiki/Blowfish ) läst gutes Hoffen:
Um Fehler durch "selbe" Passwörter zu Vermeiden nutze ich zusätzlich noch ein Salting ( https://de.wikipedia.org/wiki/Salt_(Kryptologie) ) für die Anwendung des Blowfish.Es ist kein effizienter Angriff auf die Blowfish-Verschlüsselung mit voller Rundenzahl bekannt.
Unter der Annahme eines Offline Angriffs (meine Verschlüsselte Datenbank) wird geleackt und der Quellcode ist Verfügbar (weil hier gepostet

Code: Alles auswählen
Procedure TPWM.SaveToFile(Const Filename: String; PassPhrase: String);
Var
EncrytpStream: TBlowFishEncryptStream;
fs: TFileStream;
fSalt: UInt32;
Begin
If (Not fmodified) Then exit; // Wenn Sich nichts geändert hat muss auch nichts gespeichert werden ..
// Wenn die DB, geladen wurde hat sie ein "Altes" Passwort, das muss beim Speichern stimmen, andernfalls ist alles gut
If (fPassword <> '') And (fPassword <> PassPhrase) Then Begin
Raise Exception.Create('Error: invalid password, nothing is stored.');
exit;
End;
(*
* Die Idee ist, jedes Passwort zusätzlich zufällig zu "Salzen"
* das Salz kann ganz einfach mit gespeichert werden.
* => Das Bewirkt, dass bei jedem Speichern die Datenbank komplett neu und
* anders erzeugt wird. Selbst wenn sich eigentlich nichts ändert.
*)
// Dateihandle
fs := TFileStream.Create(Filename, fmCreate Or fmOpenWrite);
// Dateiversion
fs.Write(PWM_FileVersion, SizeOf(PWM_FileVersion));
// Salt
fSalt := Random($FFFFFFFF);
fs.Write(fSalt, SizeOf(fSalt));
// Dann kommt der Verschlüsselte Teil
EncrytpStream := TBlowFishEncryptStream.Create(inttostr(fSalt) + PassPhrase + inttostr(fSalt), fs);
WriteMagicHeader(EncrytpStream); // Der Magic Header dient dazu zu erkennen ob die Entschlüsselte Datenbank gültige werte enthält =ist ein Constanter String
SaveToStream(EncrytpStream);
EncrytpStream.free;
fs.Free;
fmodified := false;
End;
Würdet ihr in dieses Beispiel eure Passwörter eingeben ?
Habt ihr Vorschläge das Sicherer zu machen / ein anderes Verschlüsselungsverfahren zu nehmen ?