我正在使用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)
为什么会这样?。当我传递两个不同的字符串时,它应该给出不同的加密字符串作为输出。这是一个错误吗?我该如何解决这个问题?我无法更改密钥。密钥应始终相同。
邮政版本:
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
pgcrypt
用于其他内容:
计算密码(3(式的密码哈希。存储新的 密码,您需要使用 gen_salt(( 生成一个新的 salt 值。自 检查密码,将存储的哈希值作为 salt 传递,并测试是否 结果与存储的值匹配。
以下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)
要使用对称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)
crypt 使用的算法嵌入在 salt 的格式中。 您的盐"alpha"没有指定算法,因此crypt
使用des
。des
只查看密码的前 8 个字符(以及盐的前 2 个字符(,并且您的两个密码在前 8 个字符中没有区别。
我无法更改密钥。
然后你的系统在设计上被破坏了。