security - 如何在 postgresql 中散列密码?

标签 security postgresql hash cryptography salt

我需要在 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/

相关文章:

c - 如何使用格式字符串攻击覆盖变量

java - 在 Web 应用程序中隐藏非常敏感的凭据的正确方法

regex - POSTGRESQL 名称中至少有 8 个字符,带有 LIKE 或 REGEX

ruby - 哈希火箭被弃用了吗?

android - 在 jni 中返回错误的 md5 哈希

Perl - 将文件文本解析为散列

java - 如何解决sonatype-2017-0312漏洞

java - JBoss 5.1.0GA "user null is NOT authenticated"问题

php - 多次在数据库中搜索表单元素

javascript - Php 脚本无法通过 ajax 运行