postgres 中的 Postgres 11.4 crypt 扩展问题
Postgres 11.4 crypt extension issue in postgres
我在我的 PostgreSQL 数据库中使用 pgcrypto 扩展进行密码加密。我使用相同的密钥来加密所有密码。当我在不同的密码(不同的字符串)中使用相同的密钥时,它会给出相同的输出。
样本:
db=# select crypt('Sharon_1','alpha');
crypt
---------------
aljp4LCkDT1k.
(1 row)
Time: 2.025 ms
db=# select crypt('Sharon_1trgstysa','alpha');
crypt
---------------
aljp4LCkDT1k.
(1 row)
为什么会这样?当我传递两个不同的字符串时,它应该给出不同的加密字符串,因为 output.Is 这是一个错误?。我该如何解决这个问题?我无法更改密钥。密钥应该始终相同。
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
pgcrypt
用于其他用途:
Calculates a crypt(3)-style hash of password. When storing a new
password, you need to use gen_salt() to generate a new salt value. To
check a password, pass the stored hash value as salt, and test whether
the result matches the stored value.
以下 CTE
使用 md5
salt 算法加密密码,select 将给定密码与 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 | $XpqL58HA$k2G55BjtVFQxHVe/jpu.2.
f | [=10=]OIuDMkZ$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 个字符(以及 salt 的前 2 个字符),并且您的两个密码的前 8 个字符没有区别。
i can't change the key.
那么你的系统被设计坏了。
我在我的 PostgreSQL 数据库中使用 pgcrypto 扩展进行密码加密。我使用相同的密钥来加密所有密码。当我在不同的密码(不同的字符串)中使用相同的密钥时,它会给出相同的输出。
样本:
db=# select crypt('Sharon_1','alpha');
crypt
---------------
aljp4LCkDT1k.
(1 row)
Time: 2.025 ms
db=# select crypt('Sharon_1trgstysa','alpha');
crypt
---------------
aljp4LCkDT1k.
(1 row)
为什么会这样?当我传递两个不同的字符串时,它应该给出不同的加密字符串,因为 output.Is 这是一个错误?。我该如何解决这个问题?我无法更改密钥。密钥应该始终相同。
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
pgcrypt
用于其他用途:
Calculates a crypt(3)-style hash of password. When storing a new password, you need to use gen_salt() to generate a new salt value. To check a password, pass the stored hash value as salt, and test whether the result matches the stored value.
以下 CTE
使用 md5
salt 算法加密密码,select 将给定密码与 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 | $XpqL58HA$k2G55BjtVFQxHVe/jpu.2.
f | [=10=]OIuDMkZ$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 个字符(以及 salt 的前 2 个字符),并且您的两个密码的前 8 个字符没有区别。
i can't change the key.
那么你的系统被设计坏了。