如何使用PostgreSQL查询针对盐腌哈希验证密码?

时间:2019-03-23 23:37:37

标签: postgresql

我有一个生成的密码哈希:

$ mkpasswd -m sha-256 -S `printf "%x%x" $RANDOM $RANDOM` 'blah'
$5$1c741b59$FBGE9z1jHJU8Njb5JkAwxdI2ock/kcgoxll8f.fdTI3

我有一个带有登录名和与上面的字符串匹配的密码值的表。

现在,我需要验证用户提供的密码是否可以通过PostgreSQL查询对哈希进行计算。

我能够使用regexp_matches函数提取盐,但不知道如何进一步进行。

有人可以帮我或指导我学习一些相关的教程吗?

我有可用的sha256_crypt函数,但是我一直在写适当的查询。

1 个答案:

答案 0 :(得分:0)

好,我设法制作了一个功能,并用它验证了密码。它还将为mkpasswd处理可选的'{SHA256-CRYPT}'前缀和-R参数中指定的回合数(如果有): 这是结果

~$ mkpasswd -m sha-256 -S `printf "%x%x" $RANDOM $RANDOM` 'blah'
$5$51486e19$l8NKop8WQYo4xhmjl/Wt1T25VMLqM8Qg9/YcYy0VYg5
~$ psql test
psql (9.6.11)
Type "help" for help.

test=# CREATE EXTENSION shacrypt;
CREATE EXTENSION
test=# create table test (login varchar(128),passwd varchar(256));
CREATE TABLE
test=# insert into test values ('user123','$5$51486e19$l8NKop8WQYo4xhmjl/Wt1T25VMLqM8Qg9/YcYy0VYg5');
INSERT 0 1
test=# CREATE LANGUAGE plperl;
CREATE LANGUAGE
test=# CREATE OR REPLACE FUNCTION sha256_verify (varchar, varchar) RETURNS boolean AS $$
    $_[0] =~ m/^(?:{SHA256-CRYPT})?(\$\d+\$(?:rounds=\d+\$)?[^\$]+)\$(.*)/;
    my ($s,$h1)=($1,$2);
    my $q="SELECT sha256_crypt(\'$_[1]\',\'$s\')";
    my $rv = spi_exec_query($q);
    my $h2 = $rv->{rows}[0]->{sha256_crypt};
    $h2 =~ m/^(\$\d+\$(?:rounds=\d+\$)?[^\$]+)\$(.*)/;
    $h2=$2;
    return 1 if ($h1 =~ m/$h2/);
    return 0;
$$ LANGUAGE plperl;
CREATE FUNCTION
test=# select login from test where login='user123' and sha256_verify(passwd,'blah');
  login  
---------
 user123
(1 row)

test=# select login from test where login='user123' and sha256_verify(passwd,'blahblah');
 login 
-------
(0 rows)