如何使用PostgreSQL加密密码?

18

我在密码编码方面遇到了一些问题,应该如何处理。编码类型是md5

digest(data text, type text) returns bytea;
CREATE OR REPLACE FUNCTION md(bytea) returns text AS $$
    SELECT encode(digest($1, 'sha1'), 'md5')
$$ LANGUAGE SQL STRICT IMMUTABLE;

INSERT INTO "login"(login, password, employee_id)
VALUES ( 'email',crypt('password', md('md5')), 1);

*** 错误*

ERROR: syntax error at or near "digest"
SQL state: 42601
Character: 1

1
第一行的第一个字符是错误的位置。在“CREATE OR REPLACE FUNCTION”上面有垃圾。 - Richard Huxton
我按照你说的尝试了,但是出现了错误。 - Karen Manukyan
2个回答

50

digest(data text, type text) returns bytea; 不是有效的语法。

我建议改用bcrypt。不需要额外的函数定义:

INSERT into "login" (login, password, employee_id) 
     VALUES ('email',crypt('password', gen_salt('bf'));

后来...

UPDATE table SET password = crypt('password',gen_salt('bf'))

检查密码:

SELECT ... FROM table 
    WHERE password is NOT NULL 
      AND password = crypt('password-to-test',password);

Bcrypt被Crafted SoftwareJeff Atwood推荐使用。你也可以参考官方pgcrypto文档


如果我之前在表中加密了密码列,那么我该如何从我的节点服务器上对这些密码进行解密? - inane

5

我知道这个问题很老了,但是对于那些遇到同样问题的人。

步骤1: 首先检查是否安装了prcrypto。

select e.extname, n.nspname from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;

步骤2:如果未安装,则创建扩展

CREATE EXTENSION IF NOT EXISTS pgcrypto;

步骤3:计算给定数据的二进制哈希值。

    CREATE OR REPLACE FUNCTION sha1(bytea) returns text AS $$
      SELECT encode(digest($1, 'sha1'), 'hex')
    $$ LANGUAGE SQL STRICT IMMUTABLE;

最后一步:

如果您想将摘要作为十六进制字符串,请使用编码函数。

SELECT encode(digest('blue', 'sha1'), 'hex');

或者

直接使用sha('blue')


1
你的方法没有使用盐。这意味着对于相同的密码,结果将是相同的,这是一个弱点。请参考@mark-stosberg的答案以获得更安全的方法。 - Moshe Gottlieb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接