module OpenSSL::KDF

Bietet Funktionalität für verschiedene KDFs (Key Derivation Function).

KDF wird typischerweise zum sicheren Ableiten von symmetrischen Schlüsseln beliebiger Länge, die mit einem OpenSSL::Cipher verwendet werden sollen, aus Passwörtern verwendet. Ein weiterer Anwendungsfall ist die Speicherung von Passwörtern: Aufgrund der Möglichkeit, den Rechenaufwand durch Erhöhung der Iterationsanzahl anzupassen, kann die Berechnung künstlich verlangsamt werden, um mögliche Angriffe unmöglich zu machen.

Derzeit bietet OpenSSL::KDF Implementierungen für die folgenden KDFs an:

Beispiele

Generieren eines 128-Bit-Schlüssels für einen Cipher (z.B. AES)

pass = "secret"
salt = OpenSSL::Random.random_bytes(16)
iter = 20_000
key_len = 16
key = OpenSSL::KDF.pbkdf2_hmac(pass, salt: salt, iterations: iter,
                               length: key_len, hash: "sha1")

Passwörter speichern

pass = "secret"
# store this with the generated value
salt = OpenSSL::Random.random_bytes(16)
iter = 20_000
hash = OpenSSL::Digest.new('SHA256')
len = hash.digest_length
# the final value to be stored
value = OpenSSL::KDF.pbkdf2_hmac(pass, salt: salt, iterations: iter,
                                 length: len, hash: hash)

Wichtiger Hinweis zum Überprüfen von Passwörtern

Beim Vergleichen von vom Benutzer bereitgestellten Passwörtern mit zuvor gespeicherten Werten wird häufig der Fehler gemacht, die beiden Werte mit „==“ zu vergleichen. Typischerweise wird „==“ beim Auswerten frühzeitig abgebrochen und ist daher anfällig für Timing-Angriffe. Der richtige Weg ist die Verwendung einer Methode, die beim Vergleichen zweier Werte immer die gleiche Zeit benötigt und somit keine Informationen an potenzielle Angreifer durchsickern lässt. Verwenden Sie dazu OpenSSL.fixed_length_secure_compare.