Шифрование хранилища

Модуль pgcrypto предоставляет два типа алгоритмов шифрования данных: одностороннее и двустороннее шифрование, что позволяет осуществлять шифрование данных на уровне базы данных для обеспечения безопасного использования данных.

  • Одностороннее шифрование является необратимым; исходный текст невозможно восстановить из зашифрованных данных. Подходит для проверки подлинности данных, например, для аутентификации паролей при входе в систему. Распространённые алгоритмы одностороннего шифрования включают MD5, SHA, HMAC и др.

  • Двустороннее шифрование является обратимым; исходный текст может быть расшифрован из зашифрованных данных с использованием ключа. Подходит для сценариев безопасной передачи данных, таких как электронные платежи и цифровые подписи. Распространённые алгоритмы двустороннего шифрования включают AES, DES, RSA, ECC, SM4 и др.

Одностороннее шифрование

Стандартные хеш-функции

  • Функция digest() генерирует двоичное хеш-значение для данных с использованием различных алгоритмов. Такие алгоритмы дают одинаковый результат при шифровании идентичных данных.
# Syntax
digest(data text, type text) returns bytea
digest(data bytea, type text) returns bytea
# 'type' specifies the algorithm to use. Standard options are md5, sha1, sha224, sha256, sha384, and sha512.

# Example usage

INSERT INTO users(username, password) 
VALUES ('tony', encode(digest('123456','md5'), 'hex'));

INSERT INTO users(username, password) 
VALUES ('anne', encode(digest('123456','md5'), 'hex'));

SELECT * FROM users;
id|username|password                        |
--|--------|--------------------------------|
 1|tony    |e10adc3949ba59abbe56e057f20f883e|
 2|anne    |e10adc3949ba59abbe56e057f20f883e|


# During comparison, use the encode() function to convert to hexadecimal
SELECT id FROM users
WHERE username = 'tony' AND password = encode(digest('123456','md5'), 'hex');
id|
--|
 1|
  • Функция hmac() генерирует двоичное хеш-значение для данных с использованием секретного ключа (psw) с помощью различных алгоритмов. Аналогично digest(), но хеш можно воспроизвести только при использовании того же ключа.
# Syntax
hmac(data text, psw text, type text) returns bytea
hmac(data bytea, psw text, type text) returns bytea
# 'type' specifies the algorithm to use. Standard options are md5, sha1, sha224, sha256, sha384, and sha512.

Двустороннее шифрование

Функции шифрования PGP

Функции шифрования PGP реализуют возможности шифрования, определённые в стандарте OpenPGP (RFC4880), включая симметричное шифрование (шифрование закрытым ключом) и асимметричное шифрование (шифрование открытым ключом).

# Encryption
pgp_sym_encrypt(data text, psw text [, options text ]) returns bytea
pgp_sym_encrypt_bytea(data bytea, psw text [, options text ]) returns bytea

# Decryption
pgp_sym_decrypt(msg bytea, psw text [, options text ]) returns text
pgp_sym_decrypt_bytea(msg bytea, psw text [, options text ]) returns bytea


# Example usage

select pgp_sym_encrypt('abc','key_value');
                                                                 pgp_sym_encrypt                                                               
  ----------------------------------------------------------------------------------------------------------------------------------------------
   \xc30d04070302f93fbd59b40bf7fd71d2340175c19d234d275f5b8ae668fecbbdfd80f0e94185f07dee15cb6d2b0dfbfdf08c98648e07da8f3d8902bb3dd349fdb36860a1ff
  (1 row)

  select pgp_sym_decrypt(pgp_sym_encrypt('abc','key_value'),'key_value');             
   pgp_sym_decrypt
  -----------------
   abc
  (1 row)

  # Common options:
  # cipher-algo: encryption algorithm to use; possible values are bf, aes128 (default), aes192, aes256
  # compress-algo: compression algorithm; available only if PostgreSQL was compiled with zlib support. Possible values: 0 (no compression, default), 1 (ZIP), 2 (ZLIB, which includes metadata and CRC)

Функции шифрования SM4

SM4 — это симметричный алгоритм шифрования, относящийся к категории двустороннего шифрования. Это коммерческий криптографический стандарт, опубликованный Государственным управлением китайской криптографии. SM4 использует блок размером 128 бит и длину ключа 128 бит, обеспечивая эффективное шифрование и дешифрование за счёт множества итераций. Широко применяется в мобильной связи, IoT, финансовой сфере и других областях.

# Encryption
encrypt(data text, psw text [, options text ]) returns bytea;

# Decryption
decrypt(msg bytea, psw text [, options text ]) returns bytea;

# Example usage
create table t1 (c1 bytea);

insert into t1 select encrypt('123456', '1462846455', 'sm4');

select * from t1;
                   c1                 
  ------------------------------------
   \xaf8aac27b4721d733852c18e9a6dd126
  (1 row)

select convert_from(public.decrypt(c1, '1462846455', 'sm4'),'utf-8') from t1;
   convert_from 
  --------------
   123456
  (1 row)

# Common option:
# cipher-algo: the encryption algorithm used is sm4