我有一个生成的密码哈希:
$ mkpasswd -m sha-256 -S `printf "%x%x" $RANDOM $RANDOM` 'blah'
$5$1c741b59$FBGE9z1jHJU8Njb5JkAwxdI2ock/kcgoxll8f.fdTI3
我有一个带有登录名和与上面的字符串匹配的密码值的表。
现在,我需要验证用户提供的密码是否可以通过PostgreSQL查询对哈希进行计算。
我能够使用regexp_matches函数提取盐,但不知道如何进一步进行。
有人可以帮我或指导我学习一些相关的教程吗?
我有可用的sha256_crypt函数,但是我一直在写适当的查询。
答案 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)