如何使用 Pgcrypto Select 来自 Postgresql 数据库的散列值和 Python

How To Select A Hashed Value From A Postgresql Database With Pgcrypto and Python

我在 Postgresql 中使用 pgcrypto 扩展来加密和加盐数据库中的用户密码存储,但我无法检索它们。

具体来说,用户的插入语句如下所示:

INSERT INTO Users (username, password) VALUES ('test1', crypt('Password1234', gen_salt('bf', 8)));

这很好用,但是当我尝试从数据库中检索时,这个查询:

SELECT username, password FROM Users WHERE username = 'test1' AND password = crypt('Password1234', gen_salt('bf', 8));

returns没有结果,查询没有失败,只是没有结果。

目前,我没有使用 python 与数据库交互(我将来会),我只是在终端中使用 psql。我知道这个查询有问题,但我不确定是什么以及如何修复它。有没有其他方法可以构建它或者我做错了什么?感谢您的帮助!

您是 re-salting 加了新盐的密码,这当然会导致与以前不同的答案。这就是腌制的全部意义。

您需要在新散列中重用第一个盐,您可以通过输入密码散列代替 gen_salt(...) 来实现。 (存储的散列密码中嵌入了盐,crypt 知道如何提取和重用它)。

SELECT username, password FROM Users WHERE username = 'test1' AND password = crypt('Password1234', password);

但是,为什么选择“密码”?一旦你验证了哈希是正确的,看到它还有什么用呢?