Webprogrammierer sollten wissen, dass sie niemals selbst versuchen sollten, Kryptografie zu implementieren.
Dies bedeutet insbesondere, dass kein Nicht-Sicherheitsexperte eines der kryptografischen Grundelemente direkt berühren sollte. Sie sollten nicht auf der Ebene von AES, SHA-1 usw. denken. Stattdessen sollten sie übergeordnete Funktionen zum Verschlüsseln und Signieren von Nachrichten und zum "Hash" von Passwörtern verwenden.
Warum? Weil die Leute sonst in die Irre geführt werden und denken, dass:
- AES-256 ist eine hervorragende Verschlüsselung, obwohl sie im EZB-Modus oder mit nicht zufälligen IV-Werten usw. verwendet wird. (In einigen Modi sind nicht zufällige, aber eindeutige IVs in Ordnung. In anderen nicht so viel.)
- Sie können denselben symmetrischen Schlüssel zum Verschlüsseln mehrerer Nachrichten verwenden (oder den symmetrischen Schlüssel für die direkte Verwendung im Code speichern).
- Sie können sich sogar dafür entscheiden, eine Passphrase direkt als Schlüssel zu verwenden, ohne Schlüsselableitungsfunktionen zu verwenden.
- Sie können RSA verwenden, um Daten direkt zu verschlüsseln.
- Sie können einfach ihre Passwörter "salzen und MD5", um sie sicher zu halten. (Wenn Sie denken, dass Regenbogentabellen das schwächste Glied sind, denken Sie noch einmal darüber nach .)
Nur um auf der gleichen Seite zu sein, ist keiner der oben genannten Punkte in Ordnung . Wenn Sie das nicht verstehen, sollten Sie Crypto nicht mit einer 10-Fuß-Stange berühren! (AES-256 ist eine großartige Verschlüsselung, aber nur, wenn Sie sie richtig verwenden. "Es kommt nicht auf die Größe an, sondern darauf, was Sie damit machen." :-))
Über welche übergeordneten Funktionen spreche ich? Ich persönlich empfehle die Verwendung einer OpenPGP-Bibliothek (für Daten in Ruhe) oder einer SSL-Bibliothek (für Daten in Bewegung). Diese Protokolle spezifizieren streng die korrekte Verwendung von asymmetrischen, symmetrischen und Hash-Algorithmen. Zum Beispiel mit OpenPGP:
- RSA wird nicht zum direkten Verschlüsseln von Daten verwendet, sondern es wird ein zufälliger Sitzungsschlüssel (symmetrisch) pro Nachricht generiert (dies ist wichtig). RSA wird zum Verschlüsseln dieses Sitzungsschlüssels verwendet.
- Es verwendet eine Schlüsselableitungsfunktion, um Passphrasen in Schlüssel umzuwandeln. (Im OpenPGP-Sprachgebrauch wird es als S2K bezeichnet, aber ich denke, "Schlüsselableitungsfunktion" ist der üblichere Begriff.)
- Es übernimmt die Auswahl eines guten Modus, sodass Sie niemals die EZB verwenden werden.
- Es übernimmt die Schlüsselverwaltung für Sie, sodass Sie keine Ad-hoc-Entscheidungen darüber treffen müssen, welche Schlüssel vertrauenswürdig sind usw.
Zusammenfassung: Wenn Sie kein Sicherheitsexperte sind und auf der Ebene von AES, SHA-1 oder (himmlisch verboten) MD5 denken, machen Sie es falsch . Verwenden Sie eine Bibliothek, die von Sicherheitsexperten (wie Bouncy Castle) geschrieben wurde und Protokolle implementiert, die von Sicherheitsexperten (wie OpenPGP für die Verschlüsselung oder bcrypt oder scrypt für das Kennwort-Hashing) entwickelt wurden, anstatt Ihre eigenen Protokolle zu erstellen.
Ich bin kein Krypto-Experte, aber ich weiß genug, um nicht zu versuchen, meine eigenen Ad-hoc-Protokolle zu entwerfen. Um es klar zu machen: Dieser gesamte Beitrag ist aus Cryptography 101-Material . Wenn dieser Beitrag für Sie also keinen 100% igen Sinn ergibt, sollten Sie auf keinen Fall in die Nähe der Kryptografie gelangen.