Асимметричные и симметричные ключи в PostgreSQL

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Привет, Хабр!

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

Немного про асимметричное и симметричное шифрование

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

  • Открытый ключ: используется для шифрования данных и доступен всем пользователям.

  • Закрытый ключ: используется для расшифрования данных и хранится в безопасности у владельца. Этот ключ не должен раскрываться другим юзером.

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

А вот симметричное шифрование использует один и тот же ключ для шифрования и расшифрования данных. Этот ключ должен быть доступен как отправителю, так и получателю сообщения.

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

Шифрование симметричными ключами в PostgreSQL

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

Для создания симметричного ключа в PostgreSQL часто используется модуль pgcrypto, который предоставляет функции для работы с криптографией. Пример создания симметричного ключа с использованием pgcrypto:

-- создание симметричного ключа
CREATE EXTENSION IF NOT EXISTS pgcrypto;

-- генерация симметричного ключа
SELECT gen_random_bytes(16) AS symmetric_key;

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

После создания ключа можно приступить к шифрованию данных. Для этого используются функции pgcrypto:

-- шифрование данных с использованием симметричного ключа
SELECT pgp_sym_encrypt('Secret message', 'AES_KEY');

-- дешифрование данных с использованием симметричного ключа
SELECT pgp_sym_decrypt('Encrypted message', 'AES_KEY');

Шифруем сообщение "Secret message" с использованием симметричного ключа AES_KEY, а затем дешифруем его обратно.

Например, нужно хранить конфиденциальную информацию о юзерах в БД, например, их пароли:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50),
    encrypted_password TEXT
);

-- вставка данных с зашифрованным паролем
INSERT INTO users (username, encrypted_password)
VALUES ('user1', pgp_sym_encrypt('password123', 'AES_KEY'));

При вставке нового пользователя мы шифруем его пароль с помощью симметричного ключа AES_KEY.

Шифрование асимметричными ключами в PostgreSQL

Первый шаг в таком шифрование - создание пары ключей: открытого и закрытого.

Для генерации пары ключей в PostgreSQL можно использовать функцию pgcrypto.gen_rsa_keypair, которая создает пару ключей RSA:

-- создание пары ключей RSA
SELECT pgp_pub_encrypt('Super secret data', rsa_pub) AS encrypted_data
FROM (SELECT pgcrypto.gen_rsa_keypair(2048) AS rsa_pub) AS keys;

Запрос создает новую пару ключей RSA и шифрует строку Super secret data с использованием открытого ключа.

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

SELECT pgp_pub_encrypt('Super secret data', rsa_pub) AS encrypted_data
FROM (SELECT '-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGP ..

mQENBE+zv4UBCAC2Xljsn1FTmLX2zW/KG1QVpukDtJZIKAFZlCz8PrQkg/hfpxiH
d4dgbUzVWg3Ew0yGmLoImf+PQK7Cf5Nvl5feoX9P9pUJ4FZfSYBF5FjS2zlbjcG+
q2K1L9zP7vIlpZ5OYd9r3HyLhKThyP2g95DWf9INtC7nFpT8Uw9+7HK20W/buyPj
...
-----END PGP PUBLIC KEY BLOCK-----' AS rsa_pub) AS keys;

Запрос шифрует строку "Super secret data" с использованием открытого ключа RSA.

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

SELECT pgp_priv_decrypt(encrypted_data, rsa_priv) AS decrypted_data
FROM (SELECT pgp_pub_encrypt('Super secret data', rsa_pub) AS encrypted_data,
             pgcrypto.gen_rsa_keypair(2048) AS rsa_priv) AS keys;

Этот запрос шифрует строку "Super secret data" с использованием открытого ключа RSA, а затем расшифровывает ее с использованием соответствующего закрытого ключа.

К примеру нужно обеспечить безопасную передачу конфиденциальной информации между двумя юзерами:

CREATE TABLE encrypted_messages (
    id SERIAL PRIMARY KEY,
    sender_username VARCHAR(50),
    recipient_username VARCHAR(50),
    encrypted_data TEXT
);

-- шифрование и сохранение сообщения для отправителя
INSERT INTO encrypted_messages (sender_username, recipient_username, encrypted_data)
VALUES ('sender', 'recipient', pgp_pub_encrypt('Secret message', rsa_pub));

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

Сравнение

Критерий

Асимметричные ключи

Симметричные ключи

Тип ключа

Два различных ключа: публичный и приватный

Один общий ключ для шифрования и дешифрования

Безопасность

Высокая

Высокая, но в целом меньше, чем у асимметричных ключей

Управление ключами

Посложней

Попроще

Производительность

Обычно медленнее

Обычно быстрее из-за одного общего ключа

Подпись и шифрование

Могут использоваться как для подписи, так и для шифрования данных

Используются только для шифрования данных


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

А больше практических навыков традиционно можно получить в рамках практических онлайн-курсов от ведущих экспертов рынка.

Источник: https://habr.com/ru/companies/otus/articles/810111/


Интересные статьи

Интересные статьи

«МегаФон» подключил к единой государственной платформе верификации звонков ИС «Антифрод» более 20 региональных и виртуальных операторов. Решение реализовано через облачные технологии российс...
В этом году наша компания впервые провела конкурс по базам данных в рамках международной олимпиады IT-Планета по информационным технологиям. Раньше на олимпиаде использовалась СУБД Oracle; наш коллега...
Привет, меня зовут Евгений Думчев, я разработчик в DD Planet. Сегодня хочу поделиться опытом подключения платежного шлюза Сбера, чем мы занимались в рамках одного из проектов. Кажется, это будет полез...
Ровно год назад с рассказа о нашем сервисе визуализации планов запросов мы начали публикацию на Хабре серии статей, посвященных работе с PostgreSQL и его особенностям. Это уже пройденные ...
Для видеозвонков в Badoo мы используем стандарт WebRTC и кодек H.264. Если верить документации, этот кодек должен без проблем работать на любых устройствах Android начиная с Android 5.0. Но на пр...