Sichere Weise zu speichern, Passwort in Windows
Ich versuche zu schützen, lokalen Datenbank enthält sensible Informationen (ähnlich diese Frage, nur für delphi 2010)
Ich bin mit DISQLite Komponente, die Unterstützung für AES-Verschlüsselung, aber ich muss immer noch den Schutz dieses Passwort ich verwenden, um zu entschlüsseln & Lesen der Datenbank.
Meine ursprüngliche Idee war es, ein zufälliges Passwort generieren, speichern Sie es mit etwas wie DPAPI (CryptProtectData
und CryptUnprotectData
Funktionen, die in Crypt32.dll), aber ich konnte keine Beispiel für Delphi
Meine Frage ist: wie kann ich sicher zu speichern eine zufällig generierte Passwort? Oder, vorausgesetzt die DPAPI Straße sicher ist, wie kann ich dies umsetzen DPAPI in Delphi?
- Als Regel, die JEDI-Bibliothek hat-Wrapper für die Windows-Kryptografie-API-Schnittstelle
JwaWinCrypt.pas
Einheit. - Sie können versuchen, LockBox, kostenlos und einfach zu bedienen: sourceforge.net/projects/tplockbox
- Danke, ja ich habe gerade gefunden hier, beenden Sie eine schwere Einheit mit kein Beispiel...keine leichtere Lösung?
- Danke, aber es ist nicht klar, wie funktioniert LockBox Hilfe bei der Implementierung sicherer Passwort-Speicher, ein Zeiger wäre mehr als willkommen!
- Versuchen Sie zuerst stackoverflow.com/questions/9449613/... es ist wirklich ganz einfach!
- Vielen Dank, aber ich kann nicht/wird sich nicht die Mühe den Benutzer zur Eingabe des Datenbank-Kennworts, das ist, warum ich bin auf der Suche nach einem sicheren Weg, um es irgendwo (lokal), dann Lesen Sie es zur Laufzeit
- Wie wird die Verschlüsselung der Passwort schützen, was? Sicherlich kann ein Angreifer nur gelesen das entschlüsselte Kennwort aus dem Speicher?
- So hat es keinen Sinn zu entschlüsseln, die nichts von der Bewerbung? 🙁
- Ich verstehe, aber ich kann nicht einfach nur speichern Sie das Kennwort im Klartext in einer ini-Datei! Ich bin zu versuchen, die Dinge so schwer wie möglich für Angreifer.
- Ja, diese dummen script kiddies das Leben schwer! 😀
- Frage: ich möchte lösen die Passwort-Speicher-Problem, indem Sie ein hash-Wert und die Speicherung der hash auf der Festplatte. Dann, wenn es Zeit für die Validierung, Hash des eingegebenen Passworts und dann die überprüfung der hash gegen den gespeicherten Wert. Da die Menschen suchen in regelmäßigen Verschlüsselung (code/decode), ist es ein Nachteil, was ich Vorschlage oder gibt es eine andere Anforderung, die hinter den meisten dieser Fragen?
- Leider habe ich muss die echte Passwort, um die Datenbank zu öffnen! Ein hash wird nicht geschnitten 🙁
- Sie haben das echte Passwort - der Benutzer gerade eingegeben!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist besser, verwenden Sie Windows' DPAPI. Es ist viel sicherer als mit anderen Methoden:
CryptProtectMemory /CryptUnprotectMemory bieten mehr Flexibilität:
Vorteile:
Nachteile:
Hinweis: "alle user" ist ein Benutzer, Werkzeuge oder Fähigkeiten zu verwenden DPAPI
Sowieso - Sie haben die Wahl.
Beachten Sie, dass @David-Heffernan hat Recht - alles, was auf dem computer gespeichert werden können entschlüsselt werden - Lesen aus dem Speicher, Einspritzen von threads in einem Prozess etc.
Auf der anderen Seite ... warum machen wir nicht cracker das Leben schwerer? 🙂
Faustregel: löschen Sie alle Puffer, die sensible Daten enthalten, nach der Verwendung von Ihnen. Dies macht nicht Dinge, die sicher super, aber verringert die Möglichkeit deinen Speicher auf sensible Daten enthalten.
Natürlich bedeutet dies nicht lösen das andere große problem: wie die anderen Delphi-Komponenten-Griff, die sensiblen Daten übergeben werden 🙂
Sicherheits-JEDI-Bibliothek hat objektorientierten Ansatz DPAPI. Auch JEDI-Projekt enthält übersetzte windows-Header für DPAPI (JWA IIRC)
UPDATE: Hier ist Beispielcode, der verwendet DPAPI (mit JEDI-API):
Hinweise:
CryptProtectMemory
ist deterministisch, was bedeutet, es ist anfällig für Frequenz-Analyse. (d.h. wenn Sie die gleichen Daten werden verschlüsselt, in mehreren Orten im Speicher, erzeugen Sie den gleichen Chiffretext, so dass ein Angreifer in der Lage sein zu sagen, Sie sind die gleiche Sache, die Auslaufen können Informationen.)Wenn Ihr Thema ist einfach zu speichern, die Benutzer müssen ein Kennwort eingeben, jedes mal, Sie sollten wissen, dass Windows hat bereits ein system zur Speicherung von Passwörtern.
Wenn Sie gehen, um Systemsteuerung -> Credential Manager. Von dort aus sind Sie auf der Suche für Windows-Anmeldeinformationen -> Generische Anmeldeinformationen.
Von dort aus können Sie sehen, dass es der gleiche Ort, der Dinge wie Remote Desktop Passwörter gespeichert sind:
Die API, die über diese Funktionalität ist
CredRead
,CredWrite
, undCredDelete
.Wickelte ich diese in drei Funktionen:
Den Ziel ist das Ding zu identifizieren, die Anmeldedaten. Ich verwende in der Regel den Namen der Anwendung.
So, dann ist es einfach:
Können Sie dann sehen, wie Sie in der Credential-Manager:
Wenn Sie möchten, Lesen Sie diese wieder:
Gibt es das zusätzliche Stück der UI arbeiten, wo Sie haben, um:
Lesen von gespeicherten Anmeldeinformationen:
Schreiben von gespeicherten Anmeldeinformationen:
Und dann löschen:
CredRead ist ein wrapper um CryptProtectData
Es sollte angemerkt werden, dass CredWrite/CredRead intern verwendet
CryptProtectData
.Den Unterschied durch die Verwendung
CryptProtectData
sich selbst ist, dass Sie nur ein blob. Es ist bis zu Ihnen, speichern Sie Sie irgendwo, und er später wieder abgerufen werden.Hier ist schön Wrapper
CryptProtectData
undCryptUnprotectData
wenn die Speicherung der Passwörter:die ist einfach genug zu verwenden:
Die eigentlichen Eingeweide sind:
- Und Entschlüsselung:
Ok, hier ist ein Beispiel mit TurboPower Lockbox (version 2)
Können Sie Ihr Kennwort zu speichern, variable in Ihrer Anwendung. Ohne speichern, um die Datei Beispiel, aber Sie können
TFileStream
zu speichern verschlüsselt(code
) Passwort ein und klicken Siedecode
es zu Lesen 🙂TaAES.Create
im JustMe ' s Antwort oben die Zeile sagtGenerateLMDKey
😉