此模块实现了用于存储加密密码的数据类型chkpass。每个密码在输入时都会自动转换为加密形式,并且始终以加密形式存储。比较时,只需与明文密码比较,比较函数会在比较之前将其加密。
代码中预留了在判定密码容易被破解时报告错误的机制。不过,目前这只是一个不做任何事情的占位实现。
如果在输入字符串前加上冒号,它就会被视为已加密的密码,直接存储而不再加密。这样就可以输入以前加密过的密码。
输出时会在前面加上冒号。这样就可以转储并重新载入密码,而不必重新加密。如果需要不带冒号的加密密码,请使用raw()函数。这样就可以将此类型与 Apache 的Auth_PostgreSQL模块等工具一起使用。
加密使用标准 Unix 函数crypt(),因此也受该函数所有常见限制的影响,尤其是只考虑密码的前八个字符。
请注意,chkpass数据类型不能建立索引。
使用示例:
test=# create table test (p chkpass);
CREATE TABLE
test=# insert into test values ('hello');
INSERT 0 1
test=# select * from test;
p
----------------
:dVGkpXdOrE3ko
(1 row)
test=# select raw(p) from test;
raw
---------------
dVGkpXdOrE3ko
(1 row)
test=# select p = 'hello' from test;
?column?
----------
t
(1 row)
test=# select p = 'goodbye' from test;
?column?
----------
f
(1 row)
D'Arcy J.M. Cain(<darcy@druid.net>)