代码之家  ›  专栏  ›  技术社区  ›  Karen Manukyan

如何使用PostgreSQL加密密码?

  •  18
  • Karen Manukyan  · 技术社区  · 11 年前

    我在编码密码方面有一些问题,我该怎么做。编码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
    
    2 回复  |  直到 11 年前
        1
  •  50
  •   Mark Stosberg    11 年前

    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 Software Jeff Atwood 这个 official pgcrypto docs 也可能感兴趣。

        2
  •  5
  •   Piyush Sharma    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;
    

    最后一步:

    如果您希望摘要为十六进制字符串,也可以使用encode函数

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

    直接地 sha('blue')