首页 > 解决方案 > Postgres 中的 Postgres 11.4 crypt 扩展问题

问题描述

我在我的 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)

为什么会这样?。当我传递两个不同的字符串时,它应该给出不同的加密字符串作为输出。这是一个错误吗?我该如何解决这个问题?我无法更改密钥。密钥应该始终相同。

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

标签: postgresqlpgcrypto

解决方案


pgcrypt用于其他用途:

计算密码的 crypt(3) 样式哈希。存储新密码时,需要使用 gen_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_encryptand 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)

推荐阅读