Słyszałeś o kradzieży danych? Oj, to nie tylko scenariusz z hollywoodzkich blockbusterów. Firmy tracą miliony dolarów przez wycieki danych, a ich reputacja rozpada się jak domek z kart. Żeby tego uniknąć, dane trzeba koniecznie chronić. Jednym z najmocniejszych podejść jest szyfrowanie.
Szyfrowanie to metoda zamiany danych w "sekretny kod", którego nie da się zrozumieć bez posiadania klucza do odszyfrowania. W PostgreSQL jest świetne rozszerzenie o nazwie pgcrypto, które upraszcza proces szyfrowania twoich danych.
pgcrypto to rozszerzenie PostgreSQL, które daje potężne narzędzia do szyfrowania i deszyfrowania danych, pracy z hashami i generowania losowych danych.
Główne możliwości pgcrypto:
- Szyfrowanie symetryczne (jeden klucz) i asymetryczne (para kluczy: prywatny i publiczny).
- Haszowanie danych do ich weryfikacji (np. haseł).
- Generowanie losowych danych, które można użyć do tworzenia tokenów, kluczy i haseł.
Tak podłączysz pgcrypto w swojej bazie danych. Jeśli wcześniej myślałeś, że magia jest tylko dla czarodziejów z Hogwartu, pozwól PostgreSQL cię zaskoczyć.
-- Podłączenie rozszerzenia pgcrypto
CREATE EXTENSION IF NOT EXISTS pgcrypto;
Szyfrowanie symetryczne: Kodujemy twoje sekrety
Funkcje do szyfrowania i deszyfrowania:
pgp_sym_encrypt(data, key)— szyfruje dane z użyciem klucza symetrycznego.pgp_sym_decrypt(data, key)— odszyfrowuje dane zaszyfrowane tym samym kluczem.
Przykład: szyfrowanie prostego tekstu
Załóżmy, że mamy tabelę users z kolumną email i chcemy zaszyfrować adresy e-mail.
-- Tworzymy tabelę users
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT
);
-- Wstawiamy dane
INSERT INTO users (email)
VALUES ('user1@example.com'), ('user2@example.com');
-- Szyfrujemy dane
UPDATE users
SET email = pgp_sym_encrypt(email, 'supersecretkey');
-- Sprawdzamy wynik
SELECT * FROM users;
Wynik: w kolumnie email teraz jest zaszyfrowany tekst, który wygląda jak bezsensowny ciąg znaków.
Deszyfrowanie danych
Kiedy musisz przywrócić dane do pierwotnej postaci, użyj funkcji pgp_sym_decrypt.
-- Deszyfrowanie danych
SELECT pgp_sym_decrypt(email::bytea, 'supersecretkey') AS original_email
FROM users;
Uwaga: nie oszczędzaj na kluczach. Klucz typu "123456" to jakbyś założył hasło na drzwi, a potem zostawił je otwarte. Używaj długich i trudnych kluczy.
Haszowanie danych: ochrona haseł na sterydach
Przechowywanie haseł w bazie w otwartym tekście to jakbyś chował pamiętnik pod poduszką w akademiku. Nie rób tak! Zamiast tego użyj haszowania.
Funkcja do haszowania: crypt(password, gen_salt('bf')) — tworzy hash dla ciągu password używając algorytmu Blowfish.
-- Przykład haszowania hasła
SELECT crypt('my_password', gen_salt('bf'));
Wynik będzie wyglądał mniej więcej tak: $2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi.
Żeby sprawdzić hasło, użyj tej samej funkcji:
-- Sprawdzanie hasła
SELECT crypt('my_password', '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi')
= '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi';
Wynik: true.
Pro tip: nigdy nie przechowuj haseł w otwartym tekście. Nawet jeśli wydaje ci się, że twoja baza jest maksymalnie zabezpieczona, zawsze używaj hashy.
Szyfrowanie asymetryczne: Dwa klucze lepsze niż jeden
Szyfrowanie asymetryczne polega na użyciu dwóch kluczy:
- Klucz publiczny (do szyfrowania).
- Klucz prywatny (do deszyfrowania).
Przykład: szyfrowanie za pomocą klucza publicznego
-- Tworzymy parę kluczy (dla prostoty trzymamy je w zmiennych)
DO $$
DECLARE
public_key TEXT;
private_key TEXT;
BEGIN
SELECT pgp_keygen_keys(1024, 'my_passphrase')
INTO public_key, private_key;
RAISE NOTICE 'Public Key: %', public_key;
RAISE NOTICE 'Private Key: %', private_key;
END $$;
Zastosowanie szyfrowania asymetrycznego
Nowoczesne systemy często używają szyfrowania asymetrycznego do wymiany danych, np. w połączeniach SSL.
Generowanie losowych danych
Do tworzenia tokenów lub losowych kluczy użyj funkcji gen_random_uuid lub gen_random_bytes.
Przykład:
-- Generowanie losowego UUID
SELECT gen_random_uuid();
-- Generowanie tablicy losowych bajtów
SELECT gen_random_bytes(16);
To przydaje się do tworzenia unikalnych identyfikatorów, tokenów dostępu lub losowych haseł.
Scenariusze użycia pgcrypto
- Szyfrowanie poufnych danych:
- Numery kart kredytowych.
- Dane osobowe klientów (np. adresy, numery telefonów).
- Rekordy medyczne.
Haszowanie haseł: Upewnij się, że nawet administrator bazy nie zobaczy haseł użytkowników.
Bezpieczne przesyłanie danych: Użycie szyfrowania asymetrycznego do przesyłania zaszyfrowanych informacji.
Generowanie tokenów: Tworzenie tokenów do autentykacji użytkowników API.
Typowe błędy przy pracy z szyfrowaniem
Przechowywanie kluczy w dostępnych miejscach. Nigdy nie trzymaj kluczy szyfrowania w bazie w otwartym tekście. Do tego używaj menedżerów sekretów.
Używanie słabych kluczy. Jeśli klucz szyfrowania jest za krótki, można go zgadnąć.
Szyfrowanie bez potrzeby. Szyfrowanie zwiększa zużycie zasobów na przetwarzanie danych. Stosuj je tylko tam, gdzie naprawdę jest potrzebne.
Zapomniany użyty klucz. Brak dokumentacji systemowej może sprawić, że nie odszyfrujesz danych.
Szyfrowanie to nie trudny, a raczej logiczny krok do ochrony twoich danych. Włącz użycie pgcrypto do swoich projektów i spraw, że bazy będą nie tylko bezpieczne, ale i bliższe standardom wymaganym w dzisiejszym świecie. PostgreSQL daje ci wszystkie narzędzia, by twoje dane stały się nie do zdobycia.
GO TO FULL VERSION