我需要在 postgresql 上用 salt 散列一些密码,但我还没有找到任何关于如何完成这项工作的相关文档。
那么如何在 postgresql 中散列密码(使用一些盐)?
最佳答案
我问这个问题已经有一段时间了,现在我对密码理论更加熟悉,所以这里是更现代的方法:
推理
- 不要使用 md5。不要使用 sha-family 快速哈希的单个循环。快速哈希有助于攻击者,因此您不希望这样。
- 改用资源密集型散列,例如 bcrypt。 Bcrypt 耗时考验,可扩展以适应 future 需求。
- 不要费心自己加盐,您可能会搞砸自己的安全性或可移植性,依靠 gen_salt() 自行生成非常棒的独特盐。
- 一般来说,不要犯傻,不要尝试编写自己的加密货币,只需使用聪明人提供的东西即可。
Debian/Ubuntu 安装包
sudo apt-get install postgresql // (of course)
sudo apt-get install postgresql-contrib libpq-dev // (gets bcrypt, crypt() and gen_salt())
sudo apt-get install php5-pgsql // (optional if you're using postgresql with php)
在你的数据库的 postgresql 中激活 crypt() 和 bcrypt
// Create your database first, then:
cd `pg_config --sharedir` // Move to the postgres directory that holds these scripts.
echo "create extension pgcrypto" | psql -d yOuRdATaBaSeNaMe // enable the pgcrypo extension
在查询中使用 crypt() 和 gen_salt()
将 :pass 与现有哈希进行比较:
select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)
使用大量随机盐创建 :password 的哈希值:
insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)
From-in-Php bcrypt hashing 稍微更可取
在 php 5.5 及更高版本中有 password_*
函数允许使用 bcrypt 进行非常简单的密码散列(大约是时候了!),并且有一个用于低于该版本的向后兼容库。 通常哈希会回退到包装 linux 系统调用以降低 CPU 使用率,尽管您可能希望确保它已安装在您的服务器上。请参阅:https://github.com/ircmaxell/password_compat (需要 php 5.3.7+)
小心记录
请注意,对于 pg_crypto,密码在从浏览器传输到 php 到数据库的所有过程中都是明文形式。这意味着如果您不注意数据库日志,它们可以以纯文本形式从查询中记录下来。例如拥有 postgresql 慢速查询日志可以从正在进行的登录查询中捕获并记录密码。
总结
如果可以的话,使用 php bcrypt,它会减少密码保持未散列的时间。尝试确保您的 linux 系统在其 crypt()
中安装了 bcrypt,以便提高性能。强烈建议至少升级到 php 5.3.7+,因为 php 的实现从 php 5.3.0 到 5.3.6.9 有点错误,并且在 php 5.2.9 中不恰本地回退到损坏的 DES
而没有警告和更低。
如果您想要/需要 in-postgres 散列,安装 bcrypt 是可行的方法,因为默认安装的散列已经过时且损坏(md5 等)。
以下是有关该主题的更多阅读的引用资料:
关于security - 如何在 postgresql 中散列密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2647158/