我read有数据类型进行加密,因此密码在您的数据库中受到保护。
我目前使用varchar
来存储密码。我有一个想法,我应该以某种方式将SHA-512函数应用于密码,并将该数据放在某处,以便删除纯文本密码。
然而,Perl中的数据类型告诉我PostgreSQL中有一种比varchar更好的方法。
PostgreSQL中密码的数据类型是什么?
答案 0 :(得分:57)
杰夫有一篇名为You're Probably Storing Passwords Incorrectly的好文章。本文讨论了在数据库中存储密码的各种方法,以及您可能遇到的一些常见陷阱。特别是,它讨论了使用散列算法,彩虹表以及使用“salt”来降低密码文件受损的风险。
使用varchar
数据类型非常适合存储正确的哈希密码。例如,以下是我在生产数据库中的实际帐户记录的一部分:
=> select account_id, email, salt, passhash from account where email = 'greg@hewgill.com'; account_id | email | salt | passhash ------------+------------------+------------------+------------------------------------------ 1 | greg@hewgill.com | GFR9uT4N4Tzl3vnK | 2c2bf00079a6d49a8f7fb17cefb52fdb41a4b043 (1 row)
在这种情况下,passhash
是与我的密码连接的salt的SHA-1的十六进制表示。
答案 1 :(得分:6)
安装“chkpass module”
此模块实现了一种用于存储加密密码的数据类型chkpass。 您需要安装postgresql contrib包并运行CREATE EXTENSION命令进行安装。
在Ubuntu 12.04中它会是这样的:
sudo apt-get install postgresql-contrib
重启postgresql服务器:
sudo /etc/init.d/postgresql restart
所有可用的扩展程序都在:
/opt/PostgreSQL/9.5/share/postgresql/extension/
现在您可以运行CREATE EXTENSION命令。
示例:
CREATE EXTENSION chkpass;
CREATE TABLE accounts (username varchar(100), password chkpass);
INSERT INTO accounts(username, "password") VALUES ('user1', 'pass1');
INSERT INTO accounts(username, "password") VALUES ('user2', 'pass2');
select * from accounts where password='pass2';
返回
username | password
---------------------------
"user2" | ":Sy8pO3795PW/k"
答案 2 :(得分:3)
Postgres版本9.4+可以使用pgcrypto扩展以更智能和更安全的方式完成此操作,如下所述:http://www.meetspaceapp.com/2016/04/12/passwords-postgresql-pgcrypto.html