Informationen, die in einer Datenbank gespeichert sind, sind oft extrem wertvoll für ein Unternehmen. Leider sind sie aber auch für Angreifer ziemlich attraktiv. Genau deshalb ist es wichtig, über Verschlüsselung nachzudenken – das ist eine der Möglichkeiten, Daten vor neugierigen Blicken zu schützen.
Verschlüsselung hilft, vertrauliche Infos zu schützen: zum Beispiel Passwörter, Kreditkartennummern oder persönliche Daten. Sie hilft auch dabei, gesetzliche Anforderungen wie GDPR oder HIPAA einzuhalten. Und falls es doch mal zu einem Leak kommt, sind verschlüsselte Daten viel weniger angreifbar, was den potenziellen Schaden reduziert.
In PostgreSQL gibt’s praktische Funktionen für symmetrische Verschlüsselung. Mit pgp_sym_encrypt(data, key) kannst du die gewünschten Daten verschlüsseln und sie dann mit pgp_sym_decrypt(encrypted_data, key) wieder entschlüsseln – mit demselben Schlüssel. Easy und sicher.
Beispiel für Datenverschlüsselung
Schritt 1: Tabelle erstellen
Wir erstellen eine Tabelle users mit einer Spalte, in der verschlüsselte Telefonnummern gespeichert werden:
-- Tabelle mit Spalte für verschlüsselte Daten erstellen
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username TEXT NOT NULL,
phone_encrypted BYTEA -- Hier werden verschlüsselte Telefonnummern gespeichert
);
Schritt 2: Daten mit Verschlüsselung hinzufügen
Jetzt fügen wir einen User hinzu und verschlüsseln dabei seine Telefonnummer:
-- Daten mit Verschlüsselung einfügen
INSERT INTO users (username, phone_encrypted)
VALUES ('john_doe', pgp_sym_encrypt('123-456-7890', 'my_secret_key'));
Achte auf die Verwendung der Funktion pgp_sym_encrypt. my_secret_key ist unser symmetrischer Schlüssel. Im echten Leben sollte der Schlüssel natürlich komplex und gut geschützt sein.
Schritt 3: Daten mit Entschlüsselung abrufen
Wenn du auf die Daten zugreifen willst, kannst du sie entschlüsseln:
-- Daten mit Entschlüsselung abrufen
SELECT
username,
pgp_sym_decrypt(phone_encrypted, 'my_secret_key') AS phone
FROM users;
Wenn der Schlüssel stimmt, siehst du die ursprüngliche Telefonnummer.
Mehr Komplexität: Verschlüsselung zu einer bestehenden Tabelle hinzufügen
Was, wenn die Tabelle schon existiert und wir jetzt eine ihrer Spalten verschlüsseln wollen? Hier ein Beispiel.
Schritt 1: Neue Spalte erstellen
Angenommen, wir haben eine Tabelle customers und wollen die Spalten mit Kreditkartennummern verschlüsseln:
-- Neue Spalte für verschlüsselte Daten hinzufügen
ALTER TABLE customers ADD COLUMN card_number_encrypted BYTEA;
Schritt 2: Daten in die verschlüsselte Spalte übertragen
Wir verschlüsseln die bestehenden Daten und übertragen sie in die neue Spalte:
-- Daten verschlüsseln und in die neue Spalte übertragen
UPDATE customers
SET card_number_encrypted = pgp_sym_encrypt(card_number, 'my_other_secret_key');
Schritt 3: Unverschlüsselte Spalte löschen
Nachdem die Daten erfolgreich verschlüsselt wurden, kann die alte Spalte gelöscht werden:
-- Alte unverschlüsselte Spalte löschen
ALTER TABLE customers DROP COLUMN card_number;
Jetzt sind die Daten durch Verschlüsselung geschützt und nur mit dem Schlüssel zugänglich.
Besonderheiten beim Arbeiten mit verschlüsselten Daten
Es gibt ein paar wichtige Dinge beim Arbeiten mit verschlüsselten Spalten:
Datentyp:
- Verschlüsselte Werte werden im Binärformat (
BYTEA) gespeichert, nicht als lesbarer Text. - Bei Abfragen musst du Entschlüsselungsfunktionen verwenden.
Suche und Filterung:
- Du kannst nicht direkt nach verschlüsselten Daten suchen, zum Beispiel:
SELECT * FROM users WHERE phone_encrypted = '123-456-7890'; -- FUNKTIONIERT NICHT!
- Stattdessen kannst du die Daten für die Abfrage entschlüsseln:
SELECT *
FROM users
WHERE pgp_sym_decrypt(phone_encrypted, 'my_secret_key') = '123-456-7890';
Performance:
Das Verschlüsseln und Entschlüsseln von Daten kann Abfragen verlangsamen. Nutze es also nur da, wo es wirklich nötig ist.
Realistisches Szenario: Passwortschutz
Passwörter zu speichern ist eine der häufigsten Aufgaben für Verschlüsselung. Statt Passwörter im Klartext zu speichern (schlechte Idee!), solltest du sie hashen.
Passwort-Hashing mit pgcrypto
Wir nutzen die Funktion crypt() für sicheres Passwort-Hashing:
-- Passwort beim Einfügen hashen
INSERT INTO users (username, phone_encrypted)
VALUES ('alice', crypt('mein_sicheres_passwort', gen_salt('bf')));
Hier erzeugt gen_salt('bf') ein Salt für das Passwort-Hashing.
Um das Passwort zu prüfen, vergleichen wir den Hash:
-- Gehashtes Passwort vergleichen
SELECT username
FROM users
WHERE crypt('mein_sicheres_passwort', phone_encrypted) = phone_encrypted;
Sicherheitstipps
- Schlüssel getrennt speichern:
Speichere symmetrische Schlüssel niemals in derselben Datenbank wie die verschlüsselten Daten.
- Verwende komplexe Schlüssel:
Einfache Schlüssel wie "123" sind leicht zu erraten.
- Schlüssel regelmäßig aktualisieren:
Um Datenlecks zu verhindern, solltest du die Schlüssel regelmäßig ändern und dabei die Daten neu verschlüsseln.
GO TO FULL VERSION