CodeGym /Kurse /SQL SELF /Einführung in die Datenverschlüsselung mit pgcrypto

Einführung in die Datenverschlüsselung mit pgcrypto

SQL SELF
Level 48 , Lektion 1
Verfügbar

Schon mal was von Datendiebstahl gehört? Oh, das ist nicht nur Stoff für Hollywood-Blockbuster. Firmen verlieren Millionen wegen Datenlecks und ihr Ruf zerbröselt wie ein Kartenhaus. Damit das nicht passiert, müssen Daten unbedingt geschützt werden. Eine der stärksten Methoden ist Verschlüsselung.

Verschlüsselung ist eine Methode, Daten in einen "Geheimcode" zu verwandeln, den man ohne den passenden Schlüssel nicht versteht. In PostgreSQL gibt es eine coole Erweiterung namens pgcrypto, die das Verschlüsseln deiner Daten super einfach macht.

pgcrypto ist eine PostgreSQL-Erweiterung, die dir mächtige Tools zum Verschlüsseln und Entschlüsseln von Daten, Arbeiten mit Hashes und Generieren von Zufallsdaten gibt.

Die wichtigsten Features von pgcrypto:

  1. Verschlüsselung mit symmetrischem (ein Schlüssel) und asymmetrischem (Schlüsselpaar: privat und öffentlich) Verfahren.
  2. Hashing von Daten zur Überprüfung (z.B. Passwörter).
  3. Generierung von Zufallsdaten, die du für Tokens, Keys und Passwörter nutzen kannst.

So bindest du pgcrypto in deiner Datenbank ein. Falls du dachtest, Magie gibt’s nur in Hogwarts, lass dich von PostgreSQL überraschen.

-- Erweiterung pgcrypto einbinden
CREATE EXTENSION IF NOT EXISTS pgcrypto;

Symmetrische Verschlüsselung: Deine Geheimnisse codieren

Funktionen zum Verschlüsseln und Entschlüsseln:

  1. pgp_sym_encrypt(data, key) — verschlüsselt Daten mit einem symmetrischen Schlüssel.
  2. pgp_sym_decrypt(data, key) — entschlüsselt Daten, die mit demselben Schlüssel verschlüsselt wurden.

Beispiel: Einen einfachen Text verschlüsseln

Angenommen, wir haben eine Tabelle users mit der Spalte email und wollen die E-Mail-Adressen verschlüsseln.

-- Tabelle users erstellen
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email TEXT
);

-- Daten einfügen
INSERT INTO users (email)
VALUES ('user1@example.com'), ('user2@example.com');

-- Daten verschlüsseln
UPDATE users
SET email = pgp_sym_encrypt(email, 'supersecretkey');

-- Ergebnis prüfen
SELECT * FROM users;

Ergebnis: In der Spalte email steht jetzt verschlüsselter Text, der wie ein sinnloser Zeichensalat aussieht.

Daten entschlüsseln

Wenn du die Daten wieder im Original brauchst, nutze die Funktion pgp_sym_decrypt.

-- Daten entschlüsseln
SELECT pgp_sym_decrypt(email::bytea, 'supersecretkey') AS original_email
FROM users;

Hinweis: Spar nicht am Schlüssel! Ein Key wie "123456" ist wie ein Türschloss mit offen gelassener Tür. Nimm lange und komplexe Schlüssel.

Daten-Hashing: Passwortschutz auf Steroiden

Passwörter im Klartext in der Datenbank zu speichern ist wie ein Tagebuch unter dem Kopfkissen im Wohnheim zu verstecken. Mach das nicht! Nutze stattdessen Hashing.

Funktion zum Hashen: crypt(password, gen_salt('bf')) — erzeugt einen Hash für den String password mit dem Blowfish-Algorithmus.

-- Beispiel für Passwort-Hashing
SELECT crypt('mein_passwort', gen_salt('bf'));

Das Ergebnis sieht ungefähr so aus: $2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi.

Um das Passwort zu prüfen, nutze dieselbe Funktion:

-- Passwort prüfen
SELECT crypt('mein_passwort', '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi') 
       = '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi';

Ergebnis: true.

Tipp: Speichere niemals Passwörter im Klartext. Auch wenn du denkst, deine Datenbank ist super sicher – immer Hashes verwenden!

Asymmetrische Verschlüsselung: Zwei Schlüssel sind besser als einer

Asymmetrische Verschlüsselung nutzt zwei Schlüssel:

  1. Öffentlicher Schlüssel (zum Verschlüsseln).
  2. Privater Schlüssel (zum Entschlüsseln).

Beispiel: Verschlüsseln mit dem öffentlichen Schlüssel

-- Schlüsselpaar erzeugen (zur Vereinfachung in Variablen speichern)
DO $$
DECLARE
    public_key TEXT;
    private_key TEXT;
BEGIN
    SELECT pgp_keygen_keys(1024, 'mein_passwortsatz')
    INTO public_key, private_key;

    RAISE NOTICE 'Öffentlicher Schlüssel: %', public_key;
    RAISE NOTICE 'Privater Schlüssel: %', private_key;
END $$;

Anwendung der asymmetrischen Verschlüsselung

Moderne Systeme nutzen asymmetrische Verschlüsselung oft für Datenaustausch, z.B. bei SSL-Verbindungen.

Zufallsdaten generieren

Für Tokens oder zufällige Schlüssel nutze die Funktion gen_random_uuid oder gen_random_bytes.

Beispiel:

-- Zufällige UUID generieren
SELECT gen_random_uuid();

-- Array aus zufälligen Bytes generieren
SELECT gen_random_bytes(16);

Das ist praktisch für eindeutige IDs, Zugriffstokens oder zufällige Passwörter.

Anwendungsfälle für pgcrypto

  1. Verschlüsselung vertraulicher Daten:
  • Kreditkartennummern.
  • Persönliche Kundendaten (z.B. Adressen, Telefonnummern).
  • Medizinische Aufzeichnungen.
  1. Passwort-Hashing: Stell sicher, dass selbst der Datenbank-Admin die Passwörter der Nutzer nicht sehen kann.

  2. Sichere Datenübertragung: Asymmetrische Verschlüsselung für den Versand verschlüsselter Infos nutzen.

  3. Token-Generierung: Tokens für die Authentifizierung von API-Usern erstellen.

Typische Fehler beim Umgang mit Verschlüsselung

Schlüssel an zugänglichen Orten speichern. Speichere niemals Verschlüsselungsschlüssel im Klartext in der Datenbank. Nutze dafür Secret-Manager.

Schwache Schlüssel verwenden. Ist der Schlüssel zu kurz, kann er geknackt werden.

Verschlüsseln ohne Notwendigkeit. Verschlüsselung kostet Performance. Nutze sie nur, wo sie wirklich gebraucht wird.

Vergessen, welchen Schlüssel man benutzt hat. Fehlende Doku kann dazu führen, dass du Daten nicht mehr entschlüsseln kannst.

Verschlüsselung ist kein Hexenwerk, sondern ein logischer Schritt zum Schutz deiner Daten. Nutze pgcrypto in deinen Projekten und mach deine Datenbanken nicht nur sicher, sondern auch fit für die Anforderungen der modernen Welt. PostgreSQL gibt dir alle Tools, um deine Daten zur uneinnehmbaren Festung zu machen.

2
Aufgabe
SQL SELF, Level 48, Lektion 1
Gesperrt
Verschlüsselung und Entschlüsselung von Daten mit symmetrischer Verschlüsselung
Verschlüsselung und Entschlüsselung von Daten mit symmetrischer Verschlüsselung
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION