Postgres 11.4 проблема расширения крипты в postgres - PullRequest
1 голос
/ 11 февраля 2020

Я использую расширение pgcrypto для шифрования пароля в моем PostgreSQL дБ. Я использую тот же ключ для шифрования всех паролей. Когда я использую один и тот же ключ в разных паролях (разных строках), он выдает один и тот же результат.

Образцы:

db=# select crypt('Sharon_1','alpha');
     crypt     
---------------
 aljp4LCkDT1k.
(1 row)

Time: 2.025 ms
db=# select crypt('Sharon_1trgstysa','alpha');
     crypt     
---------------
 aljp4LCkDT1k.
(1 row)

почему это так ?. Когда я передаю две разные строки, он должен давать разные зашифрованные строки в качестве вывода. Это ошибка ?. Как я могу решить это? Я не могу изменить ключ. Ключ должен быть всегда одинаковым.

Postgres версия:

db=# select version();

 PostgreSQL 11.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28),
 64-bit

Версия расширения:

db=# \dx pgcrypto

             List of installed extensions
   Name   | Version | Schema |       Description       
----------+---------+--------+-------------------------

 pgcrypto | 1.3     | public    | cryptographic functions

Ответы [ 2 ]

4 голосов
/ 11 февраля 2020

pgcrypt предназначен для чего-то другого:

Вычисляет крипт (3) стиль ha sh пароля. При сохранении нового пароля вам нужно использовать gen_salt () для генерации нового значения соли. Чтобы проверить пароль, передайте сохраненное значение ha sh как соль и проверьте, соответствует ли результат сохраненному значению.

Следующий CTE шифрует пароли с использованием md5 солевой алгоритм и метод выбора сравнивает данный пароль с паролями в CTE:

WITH j (val) AS (
  VALUES 
    (crypt('Sharon_1',gen_salt('md5'))),
    (crypt('Sharon_1trgstysa',gen_salt('md5')))
) 
SELECT 
  val = crypt('Sharon_1',val), -- entered password to compare!
  val -- stored password
FROM j;

 ?column? |                val                 
----------+------------------------------------
 t        | $1$XpqL58HA$k2G55BjtVFQxHVe/jpu.2.
 f        | $1$0OIuDMkZ$PH2cDjG.aRzUAvtUtvf3E1
(2 Zeilen)

Для шифрования и дешифрования с помощью симметричных c ключей PGP попробуйте pgp_sym_encrypt и pgp_sym_decrypt, например:

WITH j (val) AS (
  VALUES 
    (pgp_sym_encrypt('Sharon_1','alpha')),
    (pgp_sym_encrypt('Sharon_1trgstysa','alpha'))     
) 
SELECT pgp_sym_decrypt(val,'alpha') FROM j;


 pgp_sym_decrypt  
------------------
 Sharon_1
 Sharon_1trgstysa
(2 Zeilen)
2 голосов
/ 11 февраля 2020

Алгоритм, который будет использовать крипта, встроен в формат соли. Ваша соль "альфа" не определяет алгоритм, поэтому crypt использует des. des просматривает только первые 8 символов пароля (и первые 2 символа соли), а ваши два пароля не отличаются по первым 8 символам.

я могу ' t сменить ключ.

Тогда ваша система неработоспособна.

...