Warum gibt pgp_sym_encrypt von PostgreSQL eine andere Ausgabe zurück, obwohl sie für dieselbe Eingabe aufgerufen wird?

783
Ashish Patel

Ich erhalte unterschiedliche Ergebnisse, wenn ich den pgp_sym_encryptBefehl von PostgreSQL mit demselben Klartext und derselben Passphrase als Eingabe ausführe . Wenn ich diese unterschiedlichen Ergebnisse mit derselben Passphrase entschlüssle, bekomme ich den korrekten Klartext zurück.

Ich würde gerne verstehen, warum die Verschlüsselungsfunktion für denselben Klartext mit derselben Passphrase immer unterschiedliche Ergebnisse liefert?

Gleiches Problem mit Klartext, eindeutigem Schlüssel und Sitzungsschlüssel.

Ich habe eindeutige Einschränkungen für dieselbe Spalte erstellt, in der unterschiedliche Verschlüsselungsergebnisse angezeigt werden. Dadurch können Sie mehrmals neuen Datensatz für denselben Text hinzufügen.

Beispiel:

pgp_sym_encrypt('12345','key1') 

Wenn ich den obigen Befehl zweimal ausführe, erhalte ich eine andere Ausgabe und wenn ich die unterschiedlichen Ausgaben entschlüssle, bekomme ich denselben Klartext zurück.

2
Es fiel mir schwer, Ihre Frage zu verstehen. Ich hoffe, ich habe die Bedeutung während des Kopierens nicht geändert. Ich konnte jedenfalls keinen Sinn für "Gleiches Problem mit Nur-Text, eindeutigem Schlüssel und auch Sitzungsschlüssel" finden. Jens Erat vor 7 Jahren 0

1 Antwort auf die Frage

2
Jens Erat

OpenPGP-Verschlüsselung

In OpenPGP wird die Nachricht nicht direkt mit der Passphrase verschlüsselt. Stattdessen wird ein zufälliger Sitzungsschlüssel als Schlüssel für die symmetrische Verschlüsselung der Nachricht generiert.

Dieser Sitzungsschlüssel wird jetzt mit der Passphrase verschlüsselt. Durch Anwenden eines solchen zweistufigen Ansatzes ist es möglich, die Nachricht einmal zu verschlüsseln, die Entschlüsselung mit anderen privaten Schlüsseln oder Passphrasen durch einmaliges Hinzufügen einer verschlüsselten Kopie des Sitzungsschlüssels zuzulassen. Um zu verstehen, wie OpenPGP-Nachrichten aufgebaut sind, werfen Sie einen Blick auf RFC 4880, OpenPGP und die Ausgabe von gpg --list-packetsund pgpdumpfür die verschlüsselte Nachricht (beide geben Informationen zu den OpenPGP-Paketen aus).

Darüber hinaus wird jede Nachricht mit einigen zufälligen Bytes aufgefüllt, was zu einer völlig anderen Nachricht führt. Schließlich speichert die verschlüsselte Nachricht den Verschlüsselungszeitstempel, der offensichtlich anders ist, wenn Sie nicht zweimal in derselben Sekunde verschlüsseln.

Eine unterschiedliche Ausgabe beim zweimaligen Verschlüsseln derselben Nachricht kann sehr wichtig sein: Die Information, dass zwei Nachrichten tatsächlich dieselbe Nachricht sind, ist oft schon ein Problem. Durch zufällige Sitzungsschlüssel und Auffüllen kann ein Angreifer keine Annahme des Nachrichteninhalts treffen, vorausgesetzt, er erhält mehrere Nachrichten.

Eindeutige Einschränkung für die verschlüsselte Ausgabe

Wenn Sie eine eindeutige Einschränkung für die Nachricht benötigen, berechnen Sie eine kryptografische Hashsumme (z. B. SHA-256) für die Nachricht und speichern Sie diese zusätzlich (und berechnen Sie die eindeutige Einschränkung für die Hashsumme anstelle der verschlüsselten Nachricht).