JavaRush /Курсы /SQL SELF /Введение в шифрование данных pgcrypto

Введение в шифрование данных pgcrypto

SQL SELF
48 уровень , 1 лекция
Открыта

Вы слышали про похищение данных? О, это не просто сюжет для голливудских блокбастеров. Компании теряют миллионы долларов из-за утечек данных, а их репутация разрушается, как карточный домик. Чтобы этого не произошло, данные обязательно нужно защищать. Один из самых мощных подходов — шифрование.

Шифрование — это метод превращения данных в "секретный код", который невозможно понять, не обладая ключом для расшифровки. В PostgreSQL есть замечательное расширение под названием pgcrypto, которое упрощает процесс шифрования ваших данных.

pgcrypto — это расширение PostgreSQL, которое предоставляет мощные инструменты для шифрования и дешифрования данных, работы с хэшами и генерации случайных данных.

Основные возможности pgcrypto:

  1. Шифрование симметричным (один ключ) и асимметричным (пара ключей: приватный и публичный) способом.
  2. Хэширование данных для их проверки (например, паролей).
  3. Генерация случайных данных, которые можно использовать для создания токенов, ключей и паролей.

Вот как подключить pgcrypto в вашей базе данных. Если вы раньше думали, что магия доступна только волшебникам из Хогвартса, позвольте PostgreSQL удивить вас.

-- Подключение расширения pgcrypto
CREATE EXTENSION IF NOT EXISTS pgcrypto;

Симметричное шифрование: Кодируем ваши секреты

Функции для шифрования и дешифрования:

  1. pgp_sym_encrypt(data, key) — шифрует данные с использованием симметричного ключа.
  2. pgp_sym_decrypt(data, key) — расшифровывает данные, шифрованные с использованием того же ключа.

Пример: шифрование простого текста

Допустим, у нас есть таблица users с колонкой email, и мы хотим зашифровать адреса электронной почты.

-- Создаем таблицу users
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email TEXT
);

-- Вставляем данные
INSERT INTO users (email)
VALUES ('user1@example.com'), ('user2@example.com');

-- Шифруем данные
UPDATE users
SET email = pgp_sym_encrypt(email, 'supersecretkey');

-- Проверяем результат
SELECT * FROM users;

Результат: в колонке email теперь хранится зашифрованный текст, который выглядит как бессмысленный набор символов.

Дешифровка данных

Когда вам нужно вернуть данные в их первоначальный вид, используйте функцию pgp_sym_decrypt.

-- Расшифровка данных
SELECT pgp_sym_decrypt(email::bytea, 'supersecretkey') AS original_email
FROM users;

Примечание: не экономьте на ключах. Ключ вроде "123456" — это все равно, что поставить пароль на дверь, а затем оставить дверь открытой. Используйте длинные и сложные ключи.

Хэширование данных: защита паролей на стероидах

Хранить пароли в базе данных в открытом виде — это все равно, что прятать дневник под подушкой в коммуналке. Не делайте так! Вместо этого используйте хэширование.

Функция для хэширования: crypt(password, gen_salt('bf')) — создает хэш для строки password, используя алгоритм Blowfish.

-- Пример хэширования пароля
SELECT crypt('my_password', gen_salt('bf'));

Результат будет выглядеть примерно так: $2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi.

Чтобы проверить пароль, используйте ту же функцию:

-- Проверка пароля
SELECT crypt('my_password', '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi') 
       = '$2a$10$Efgnd3tFs3tOH6r3RgW5/uLPhNTa43k5E2C5Ut0Ydo7RNHZjG.vi';

Результат: true.

Про совет: никогда не храните пароли в открытом виде. Даже если вам кажется, что ваша база данных максимально защищена, всегда используйте хэши.

Асимметричное шифрование: Два ключа лучше, чем один

Асимметричное шифрование предполагает использование двух ключей:

  1. Публичный ключ (для шифрования).
  2. Приватный ключ (для дешифровки).

Пример: шифрование с помощью публичного ключа

-- Создаем пару ключей (для простоты храним их в переменных)
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 $$;

Применение асимметричного шифрования

Современные системы часто используют асимметричное шифрование для обмена данными, например, в SSL-соединениях.

Генерация случайных данных

Для создания токенов или случайных ключей используйте функцию gen_random_uuid или gen_random_bytes.

Пример:

-- Генерация случайного UUID
SELECT gen_random_uuid();

-- Генерация массива случайных байтов
SELECT gen_random_bytes(16);

Это полезно для создания уникальных идентификаторов, токенов доступа или случайных паролей.

Сценарии использования pgcrypto

  1. Шифрование конфиденциальных данных:
  • Номера кредитных карт.
  • Персональные данные клиентов (например, адреса, номера телефонов).
  • Медицинские записи.
  1. Хэширование паролей: Убедитесь, что даже администратор базы данных не может увидеть пароли пользователей.

  2. Безопасная передача данных: Использование асимметричного шифрования для передачи зашифрованной информации.

  3. Генерация токенов: Создание токенов для аутентификации пользователей API.

Типичные ошибки при работе с шифрованием

Хранение ключей в доступных местах. Никогда не храните ключи шифрования в базах данных в открытом виде. Для этого используйте менеджеры секретов.

Использование слабых ключей. Если ключ шифрования слишком короткий, его могут подобрать.

Шифрование без необходимости. Шифрование увеличивает ресурсы на обработку данных. Применяйте его только там, где оно действительно нужно.

Забыли, какой ключ использовали. Отсутствие системной документации может привести к невозможности расшифровать данные.

Шифрование — это не трудный, а скорее логичный шаг к защите ваших данных. Включите использование pgcrypto в свои проекты, и вы сделаете базы данных не только безопасными, но и ближе к стандартам, требуемым в современном мире. PostgreSQL дает все инструменты для превращения ваших данных в неприступную крепость.

2
Задача
SQL SELF, 48 уровень, 1 лекция
Недоступна
Шифрование и дешифровка данных с помощью симметричного шифрования
Шифрование и дешифровка данных с помощью симметричного шифрования
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ