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
4

2 回答 2

48

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 文档也可能很有趣。

于 2013-09-06T14:25:17.187 回答
4

我知道这个问题很老,但对于那些有同样问题的人来说。

第一步:首先检查是否安装了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')

于 2019-05-17T13:29:05.730 回答