如何使用 PostgreSQL 加密密码?

Posted

技术标签:

【中文标题】如何使用 PostgreSQL 加密密码?【英文标题】:How do I encrypt passwords with PostgreSQL? 【发布时间】:2013-09-10 11:31:41 【问题描述】:

我在编码密码时遇到了一些问题,我该如何解决。 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】:

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);

Crafted Software 和 Jeff Atwood 推荐使用 Bcrypt。 official pgcrypto docs 也可能感兴趣。

【讨论】:

谢谢,你帮了我。 如果我之前加密了表中的密码列,如何从节点服务器中对这些密码进行解密?【参考方案2】:

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

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

【讨论】:

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

以上是关于如何使用 PostgreSQL 加密密码?的主要内容,如果未能解决你的问题,请参考以下文章

postgresql 的 crypt() 函数如何知道密码与存储的密码匹配?

在 PostgreSQL 中使用加密密码创建用户

使用 md5 加密密码而不是明文密码登录 PostgreSQL

PostgreSQL 将密码加密从 SCRAM 降级为 md5

我们如何在 PostgreSQL 中使用加密获取地理服务器中的原始数据

如何重置 PostgreSQL 密码