Bazadakı məlumatlar şirkət üçün çox böyük dəyərə malik olur. Amma təəssüf ki, bu məlumatlar zərərli şəxslər üçün də çox cəlbedicidir. Ona görə də şifrələmə barədə düşünmək vacibdir — bu, məlumatları yad gözlərdən qorumağın yollarından biridir.
Şifrələmə konfidensial məlumatları qorumağa kömək edir: məsələn, parolları, kredit kartı nömrələrini və ya şəxsi məlumatları. Həmçinin bu, GDPR və ya HIPAA kimi müxtəlif qanunların tələblərinə əməl etməyə kömək edir. Əgər birdən məlumat sızarsa, şifrələnmiş məlumatlar daha az həssas olacaq və bu da potensial ziyanı azaldacaq.
PostgreSQL-də simmetrik şifrələmə üçün rahat funksiyalar var. pgp_sym_encrypt(data, key) funksiyası ilə istədiyin məlumatı şifrələyə bilərsən, sonra isə pgp_sym_decrypt(encrypted_data, key) ilə həmin açarla deşifrə edə bilərsən. Hər şey sadədir — və təhlükəsizdir.
Məlumatların şifrələnməsi nümunəsi
Addım 1: Cədvəlin yaradılması
users adlı cədvəl yaradaq, burada şifrələnmiş telefon nömrələri saxlanacaq bir sütun olacaq:
-- Şifrələnmiş məlumatların saxlanılması üçün sütunlu cədvəlin yaradılması
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username TEXT NOT NULL,
phone_encrypted BYTEA -- Burada şifrələnmiş telefon nömrələri saxlanacaq
);
Addım 2: Şifrələmə ilə məlumat əlavə etmək
İndi istifadəçi əlavə edək, onun telefon nömrəsini şifrələyək:
-- Şifrələmə ilə məlumat əlavə etmək
INSERT INTO users (username, phone_encrypted)
VALUES ('john_doe', pgp_sym_encrypt('123-456-7890', 'my_secret_key'));
pgp_sym_encrypt funksiyasından istifadə etdiyimizə fikir ver. my_secret_key — bizim simmetrik açarımızdır. Real həyatda açar mürəkkəb və yaxşı qorunan olmalıdır.
Addım 3: Deşifrə ilə məlumatı çıxarmaq
Məlumatlara baxmaq lazım olanda, onları deşifrə edə bilərik:
-- Deşifrə ilə məlumatı çıxarmaq
SELECT
username,
pgp_sym_decrypt(phone_encrypted, 'my_secret_key') AS phone
FROM users;
Açar düzgün olarsa, orijinal telefon nömrəsini görəcəksən.
Daha çətin səviyyə: mövcud cədvələ şifrələmə əlavə etmək
Bəs cədvəl artıq varsa və biz onun bir sütununda məlumatları şifrələməyə başlamaq istəyirik? Gəlin nümunəyə baxaq.
Addım 1: Yeni sütunun yaradılması
Tutaq ki, bizdə customers adlı cədvəl var və kredit kartı nömrələrini şifrələmək istəyirik:
-- Şifrələnmiş məlumatlar üçün yeni sütun əlavə etmək
ALTER TABLE customers ADD COLUMN card_number_encrypted BYTEA;
Addım 2: Məlumatların şifrələnmiş sütuna köçürülməsi
Mövcud məlumatları şifrələyirik və onları yeni sütuna köçürürük:
-- Məlumatların şifrələnməsi və yeni sütuna köçürülməsi
UPDATE customers
SET card_number_encrypted = pgp_sym_encrypt(card_number, 'my_other_secret_key');
Addım 3: Şifrələnməmiş sütunun silinməsi
Məlumatlar uğurla şifrələndikdən sonra köhnə sütunu silmək olar:
-- Köhnə şifrələnməmiş sütunun silinməsi
ALTER TABLE customers DROP COLUMN card_number;
İndi məlumatlar şifrələmə ilə qorunur və onlara yalnız açar olduqda giriş mümkündür.
Şifrələnmiş məlumatlarla işləməyin xüsusiyyətləri
Şifrələnmiş sütunlarla işləyərkən bir neçə vacib məqam var:
Məlumat tipi:
- Şifrələnmiş dəyərlər ikili formatda (
BYTEA) saxlanılır, oxunaqlı formada yox. - Sorğularda deşifrə funksiyalarından istifadə etmək lazımdır.
Axtarış və filtrasiya:
- Şifrələnmiş məlumatlara görə birbaşa sətr axtarmaq olmur, məsələn:
SELECT * FROM users WHERE phone_encrypted = '123-456-7890'; -- İŞLƏMƏYƏCƏK!
- Bunun əvəzinə, məlumatları deşifrə edib seçim edə bilərsən:
SELECT *
FROM users
WHERE pgp_sym_decrypt(phone_encrypted, 'my_secret_key') = '123-456-7890';
Performans:
Məlumatların şifrələnməsi və deşifrə olunması sorğuları ləngidə bilər. Onlardan yalnız həqiqətən lazım olan yerdə istifadə et.
Real ssenari: parolların qorunması
Parolların saxlanılması — şifrələmənin ən çox rast gəlinən məsələlərindən biridir. Parolları açıq şəkildə saxlamaq (pis ideyadır) əvəzinə, onları hash-ləmək lazımdır.
pgcrypto istifadə edərək parolun hash-lənməsi
Parolları təhlükəsiz hash-ləmək üçün crypt() funksiyasından istifadə edəcəyik:
-- Qeyd əlavə edərkən parolun hash-lənməsi
INSERT INTO users (username, phone_encrypted)
VALUES ('alice', crypt('my_secure_password', gen_salt('bf')));
Burada gen_salt('bf') parolun hash-lənməsi üçün salt yaradır.
Parolu yoxlamaq üçün onun hash-ını müqayisə edirik:
-- Hash-lənmiş parolun müqayisəsi
SELECT username
FROM users
WHERE crypt('my_secure_password', phone_encrypted) = phone_encrypted;
Təhlükəsizlik məsləhətləri
- Açarları ayrıca saxla:
Simmetrik açarları heç vaxt şifrələnmiş məlumatlarla eyni bazada saxlamayın.
- Mürəkkəb açarlardan istifadə et:
"123" kimi sadə açarlar asanlıqla tapıla bilər.
- Açarları mütəmadi olaraq yenilə:
Məlumat sızmasının qarşısını almaq üçün açarları vaxtaşırı dəyişmək və məlumatları yenidən şifrələmək məsləhətdir.
GO TO FULL VERSION