[Crosspost] Neulich, im Krypto-Sumpf... verschlüsseln und signieren mit OpenSSL
Posted: 2015-08-11 17:42
Moin, die u. g. Frage habe ich auch bei BSDForen.de gestellt. Da ich keinen Aspekt übersehen möchte, gibt's sie ausnahmsweise auch hier als Crosspost:
Ach ja, AES im CBC Modus zu verwenden halte ich für relativ unbedenklich, da in diesem Fall sowohl Key als auch IV und Salt jedes Mal neu generiert werden, und die Authentizität des Cipher Textes zusätzlich mittels Signatur oder HMAC validiert wird.Daemotron bei BSDForen.de wrote:Ich weiß, der Standard-Ratschlag lautet: Finger weg von Krypto. In dem Fall versuche ich allerdings auch "nur", vorgefertigte Komponenten zu nutzen, um Backup-Dateien vor dem Wegspeichern auf einem potenziell unsicheren System zu verschlüsseln und zu signieren. Ich möchte das ganze nur mit OpenSSL umsetzen, da es nur ein Shell-Skript werden soll (damit fallen NaCl oder Sodium leider aus) und ich möglichst dafür kein Third Party Zeugs (z. B. GnuPG) installieren müssen möchte (Recovery soll aus einem Rettungssystem heraus möglich sein).
Folgendes Vorgehen habe ich mir bei Colin Percival und Daniel Bernstein's NaCl Bibliothek abgeguckt (falls ich das alles richtig verstanden habe):
Im Ergebnis hätte ich also drei Dateien: die eigentlichen Daten gepackt und AES-verschlüsselt, eine Signatur-Datei für die verschlüsselten Daten und eine RSA-verschlüsselte Datei mit den AES Schlüsseldaten und dem HMAC. Der HMAC ist dabei eigentlich doppelt gemoppelt (schließlich gibt es ja eine Signatur-Datei), andererseits gibt der HMAC ein gutes zusätzliches Padding für die AES Schlüsseldaten ab... Die Signatur muss übrigens aus praktischen Gründen in einer separaten Datei bleiben - sie ist einfach zu groß, um per RSA verschlüsselt zu werden.
- Datenstrom komprimieren (ich nutze dazu xz)
- Erzeugen eines Random Schlüssels, eines Random Salts und eines Random IVs plus ein Random HMAC Passwort
- Datenstrom verschlüsseln (in Ermangelung einer Salsa20 Implementierung in OpenSSL würde ich dazu aes265-cbc verwenden, mit dem soeben generierten Schlüssel, Salt & IV)
- Erstellung einer HMAC (in Ermangelung von Salsa20 und Poly1305 mit SHA512)
- Erstellung einer Signatur (in Ermangelung von Curve 25519 mit SHA512 und RSA)
- Verpacken von Schlüsseln, Salt und IV zusammen mit dem HMAC in einer Datei
- Diese Datei mit xz komprimieren
- Das Komprimat mit RSA verschlüsseln
Vorteil aus meiner Sicht:
Man benötigt immer nur den öffentlichen und privaten RSA Schlüssel zur Backup-Erstellung (verzichtet man auf die Signatur und verlässt sich ausschließlich auf den HMAC, benötigt man sogar nur den öffentlichen Schlüssel für die Backup-Erstellung; der private Schlüssel kann dann schön im Safe bleiben)
Potenzielle Risiken:Wie bewertet Ihr die Sicherheit und die Praktikabilität bei diesem Vorgehen? Welche Fettnäpfe habe ich übersehen?
- Wenn die Schlüsseldatei beschädigt wird, kommt man an das eigentliche Backup nicht mehr ran.
- Jemand könnte die Schlüsseldateien aufmachen (wie wahrscheinlich ist sowas?) und käme dann an alles heran, könnte auch den Inhalt des Backups in bösartiger Weise manipulieren und mit einem veränderten HMAC Integrität vortäuschen... (insb. wenn auf die Signatur verzichtet wird, was aber das Leak-Risiko für den privaten RSA Schlüssel wiederum senkt...)