Wie ent/-verschlüssliche ich Daten (auch teil Hashing)?
Hallo. Meine Frage ist folgende:
Es müssen ja Daten sicher verschlüsselt werden (auf Datenbanken). Allerdings ist meine Frage folgende. Wenn ich diese verschlüssle, kann ich dies rückgängig machen (also, dass ich wieder auf die eigentliche z. B. Email komme). Beim Hashen, wird es ja komplett verschlüsselt also man kann dies nie mehr rückgängig machen. Meine Frage deswegen. Sollte man für normale Daten wie zum Beispiel E-Mails oder ein Datum nur verschlüsslungs Algorithmen nutzen (weil auf diese Daten muss man ja teils noch zugreifen)? Auch bitte welcher da zu empfehlen ist. Beim Hashen für Passwörter hatte ich jetzt den SHA-256-Hash genutzt. Ist dieser zu empfehlen? Danke im Voraus? Bei Fragen, einfach Fragen :)
2 Antworten
Es müssen ja Daten sicher verschlüsselt werden (auf Datenbanken).
Jaein... Nein: Daten können verschlüsselt werden. Gerade für Datenbanken gibt es meist dafür keinen Use-Case, da die Daten entschlüsselt werden können sobald ein Angreifer das System kompromittiert, das die Datenbank auslesen kann. Und das System (Programm) wird es geben, da man sonst keine Datenbank bräuchte.
Zumal werden Datenbank-Features wie Volltextsuche und generell Querries etc., einen extremen Performance-Verlust erleiden.
Ja: Wenn man verschlüsselt, dann sicher. Deswegen greift man auf Algorithmen zurück die durch die Öffentlichkeit geprüft werden und nimmt Open Source Implementierungen und implementiert diese nicht selbst. Z.B. AES, RSA, Blowfish über die OpenSSL Library.
Allerdings ist meine Frage folgende. Wenn ich diese verschlüssle, kann ich dies rückgängig machen (also, dass ich wieder auf die eigentliche z. B. Email komme).
Ja: Eine Verschlüsselung kann immer rückgängig gemacht werden (anders als Hashing). Es gibt verschiedene Arten wie symetrische (AES) oder asymethrische (RSA) Verschlüsselung. Bei symetrischen Verfahren ist das Geheimnis zum Ent-/ Verschlüsselng das selbe. Somit hat mein ein Problem beim Ausstausch vom Schlüssel da vor der Verschlüsselung noch kein sicherer Kommunikationskanal vorhanden ist. Asymethrische Verfahren lösen das Problem mit einem öffentlichen und privaten Schlüssel als Paar. Sind aber rechenintensiver und haben einen hohen Overhead in der Datenmenge.
Beim Hashen, wird es ja komplett verschlüsselt also man kann dies nie mehr rückgängig machen. Meine Frage deswegen. Sollte man für normale Daten wie zum Beispiel E-Mails oder ein Datum nur verschlüsslungs Algorithmen nutzen (weil auf diese Daten muss man ja teils noch zugreifen)?
Beim Hashen wird gar nicht verschlüsselt sondern eine Prüfsumme gebildet, die möglichst für jeden Eingangswert ein einzigartiges Ergebnis darstellt. Ändert sich auch nur ein Byte am Eingang, muss ein komplett neuer Hash entstehen der mit den anderen Hashes nichts zu tun hat. Man kann sagen, dass ein Hash einem Zufall mit kryptografischer Qualität entsprechen muss. Aus einem Hashwert kann man nicht zurück auf den Eingang schließen.
Mit Hashes kann man die Integrität von Daten sicherstellen. Statt z.B. ein Passwort zu speichern, das bei einem Angriff ausgelesen werden kann, kann man ein Hashwert des Passworts speichern. Gibt der User sein Passwort ein, kann man den Hashert erneut bilden und die Hashes vergleichen. Oder man kann feststellen, ob sich Daten bei der Übertragung fehlerhafterweise geändert haben, u.v.m.
Also wenn du deine Emails noch lesen möchtest, kannst du nicht einfach nur die Hashes aufheben. Ein Hash hat auch eine fixe Länge. Z.B. Sha 256 (256 Bit) hat 32 Byte. Also die Länge eines Textes mit 32 Zeichen. Dass da Informationen verloren gehen müssen, sollte klar sein.
Auch bitte welcher da zu empfehlen ist. Beim Hashen für Passwörter hatte ich jetzt den SHA-256-Hash genutzt. Ist dieser zu empfehlen? Danke im Voraus? Bei Fragen, einfach Fragen :)
Bei Passwörtern solltest du einen Salted Hash mit einer gewissen "Cost" verwenden. Ich glaube Sha ist mittlerweile zu einfach zu bilden. Also es geht um den Aufwand, den ein Angreifer betreiben müsste um zufällige Kennwörter gegen die Hashes zu testen. Am Besten in einen Passworthashformat nutzen, dass den Algorithmus, die Cost und den Salt enthält. So können die Parameter später angepasst werden wenn die Leistung der Computertechnik voranschreitet.
Beispiel in PHP, erzeugt ein Passwort Hash mit dem Algo "BCRYPT" und einer Cost von 12. Der Salt wird automatisch eingefügt:
php > echo password_hash('hallo', PASSWORD_BCRYPT, ['cost' => 12]);
$2y$12$vyl2ZWmM7aaA8404dwD9jOMUY3nz6rVppBieIZOjXM1Cpwdfn8mhK
Der Salt verhindert übrigens, dass zwei selbe Passwörter den selben Hash erhalten. So muss jedes Kennwort einzeln geknackt werden. Außerdem erhöht er die Komplexität des Passworts.
Das verschlüsseln von Daten in einer Datenbank ergibt allgemein keinen Sinn, da es den Betrieb massiv stört. Wenn dann müßte sie unterhalb der DB-Engine geschehen, weil ich z.B. dem Speicherort nicht vertrauen kann.
Wenn Du Passwörter in einer DB hinterlegen willst, dann sollten dafür nur gesalzene Hashwerte Verwendung finden. Welches Verfahren Du nutzt ist im Prinzip egal, solange es zu jenen gehört, die noch als kryptographisch sicher gelten, d.h. SHA2/3 sollte ansich nichts im Wege stehen.