使用 PostgreSQL 摘要函数尝试检查密码时出错

Error using PostgreSQL digest function trying to check password

我正在使用 PostgreSQL 9.5 并试图理解如何在 pgcrypto 模块中使用摘要和 crypt 函数存储密码。 我有一个 table 这样的:

CREATE TABLE "usuarios" (
"id" integer NOT NULL ,
"password" varchar(120),
CONSTRAINT usuarios_pk PRIMARY KEY ("id")
);

我使用此查询成功保存了第一行:

INSERT INTO public.usuarios VALUES (DEFAULT,digest('somesalt' || 'mypass','sha256'));

我在使用 crypt()

的示例之后使用 sha256 算法阅读了此 post and the official documentation 的全局盐和摘要的想法

我的问题是,当我尝试将 pgAdmin 中的密码与以下查询进行比较时:

SELECT (usuarios.password = digest('somesalt' || 'mypass','sha256')) AS Match FROM usuarios; 

我收到密码类型 (varchar) 和摘要类型 (bytea) 不匹配的错误。我一直在寻找解决方法或演员阵容如何,但找不到它,或者,也许无法理解我眼皮底下的情况。 有帮助吗?

您需要投射您的摘要,例如(注意摘要后的 ::varchar):

SELECT (usuarios.password = digest('somesalt' || 'mypass','sha256')::varchar) AS Match FROM usuarios;

另请注意,sha256 对密码哈希处理来说并不是很好PostgreSQL has better functions for password hashing. Also see this SO answer