class OpenSSL::Digest

OpenSSL::Digest ermöglicht es Ihnen, kryptografisch sichere Nachrichten-Digests (manchmal auch als "Hashes" bezeichnet) beliebiger Daten zu berechnen, d.h. ein Digest implementiert eine sichere Einwegfunktion.

Einwegfunktionen bieten einige nützliche Eigenschaften. Zum Beispiel ist die Wahrscheinlichkeit, dass zwei unterschiedliche Eingaben denselben Ausgabewert ergeben, äußerst gering. In Kombination mit der Tatsache, dass jeder Nachrichten-Digest-Algorithmus eine feste Ausgabelänge von nur wenigen Bytes hat, werden Digests häufig verwendet, um eindeutige Identifikatoren für beliebige Daten zu erstellen. Ein gängiges Beispiel ist die Erstellung einer eindeutigen ID für binäre Dokumente, die in einer Datenbank gespeichert werden.

Ein weiteres nützliches Merkmal von Einwegfunktionen (und damit der Name) ist, dass es bei einem gegebenen Digest keinen Hinweis auf die ursprünglichen Daten gibt, die ihn erzeugt haben, d.h. der einzige Weg, die ursprüngliche Eingabe zu identifizieren, ist das "Brute-Force"-Durchprobieren aller möglichen Eingabekombinationen.

Diese Eigenschaften machen Einwegfunktionen auch zu idealen Begleitern für Public-Key-Signaturalgorithmen: Anstatt ein gesamtes Dokument zu signieren, wird zuerst ein Hash des Dokuments mit einem erheblich schnelleren Nachrichten-Digest-Algorithmus erstellt und nur die wenigen Bytes seiner Ausgabe müssen mit dem langsameren Public-Key-Algorithmus signiert werden. Um die Integrität eines signierten Dokuments zu validieren, genügt es, den Hash neu zu berechnen und zu überprüfen, ob er mit dem in der Signatur übereinstimmt.

Sie können eine Liste aller auf Ihrem System unterstützten Digest-Algorithmen erhalten, indem Sie diesen Befehl in Ihrem Terminal ausführen

openssl list -digest-algorithms

Zu den von OpenSSL 1.1.1 unterstützten Nachrichten-Digest-Algorithmen gehören

Jeder dieser Algorithmen kann anhand seines Namens instanziiert werden

digest = OpenSSL::Digest.new('SHA256')

Das "Brechen" eines Nachrichten-Digest-Algorithmus bedeutet, seine Einwegfunktionseigenschaften zu umgehen, d.h. eine Kollision zu erzeugen oder einen Weg zu finden, zu den ursprünglichen Daten zu gelangen, der effizienter ist als Brute-Force usw. Die meisten der unterstützten Digest-Algorithmen können in diesem Sinne als gebrochen betrachtet werden, selbst die sehr beliebten Algorithmen MD5 und SHA1. Wenn Sicherheit Ihre höchste Priorität hat, sollten Sie sich wahrscheinlich auf SHA224, SHA256, SHA384 oder SHA512 verlassen.

Hashing einer Datei

data = File.binread('document')
sha256 = OpenSSL::Digest.new('SHA256')
digest = sha256.digest(data)

Hashing mehrerer Datenstücke gleichzeitig

data1 = File.binread('file1')
data2 = File.binread('file2')
data3 = File.binread('file3')
sha256 = OpenSSL::Digest.new('SHA256')
sha256 << data1
sha256 << data2
sha256 << data3
digest = sha256.digest

Wiederverwendung einer Digest-Instanz

data1 = File.binread('file1')
sha256 = OpenSSL::Digest.new('SHA256')
digest1 = sha256.digest(data1)

data2 = File.binread('file2')
sha256.reset
digest2 = sha256.digest(data2)