我怎样才能哈希PostgreSQL中的密码?我怎样才能哈希PostgreSQL中的密码?(How c

2019-05-13 04:26发布

我需要一些哈希密码与PostgreSQL的盐,我一直没能找到关于如何弄完任何相关文件。

所以,我怎么可以散列在PostgreSQL中的密码(与一些盐)?

Answer 1:

它已经有一段时间我问这个问题,我更熟悉的密码理论了,所以这里是更现代的方法:

推理

  • 不要使用MD5。 不要使用SHA-家庭快速散列的单周期。 快速哈希帮助攻击者,所以你不希望出现这种情况。
  • 使用一个资源密集型的散列,如bcrypt,来代替。 Bcrypt是经过时间考验的,并可扩展至是面向未来的,能够。
  • 不要打扰滚动自己的盐,你可能会搞砸了自己的安全和便携性,依靠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)

激活的crypt()和bcrypt在PostgreSQL的数据库中的

// 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()

比较:通过对现有散有:

select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)

与一个伟大的随机盐密码:创建的哈希:

insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)

从式的PHP bcrypt哈希略有preferrable

password_*在PHP 5.5及以上的,允许用bcrypt平凡简单的密码散列函数(约时间!),并且对于低于版本向后兼容库。 普遍认为散列回落到包装Linux系统呼吁降低CPU使用率,无论如何,虽然你可能希望确保它安装在服务器上。 请参阅: https://github.com/ircmaxell/password_compat (需要PHP 5.3.7+)

小心测井

请注意,pg_crypto,密码是明文所有来自浏览器的传输过程中,到PHP,到数据库中。 这意味着他们可以在明码查询,如果你不小心你的数据库日志记录。 例如,具有PostgreSQL的慢查询日志可以赶上并从正在进行的登录查询日志的密码。

综上所述

使用PHP bcrypt如果可以的话,它会减少,密码仍然未散列的时间。 尽量保证你的Linux系统已经安装bcrypt在它crypt()所以这是高性能的。 至少升级到PHP强烈建议5.3.7+作为PHP的实现是稍微从PHP 5.3.0马车到5.3.6.9,以及不适当地回落到破DES没有在PHP 5.2.9和较低的警告。

如果你想在-Postgres的散列/需要,安装bcrypt是要走的路,因为默认安装的哈希值是破烂不堪(MD5等)。

下面是有关该主题的更多阅读参考:

  • http://codahale.com/how-to-safely-store-a-password/
  • http://www.postgresql.org/docs/9.2/static/pgcrypto.html
  • https://github.com/ircmaxell/password_compat


Answer 2:

应用程序应该使用哈希像bcrypt或PBKDF2密钥导出函数的密码。 这里是安全的密码存储的详细信息 。

...但有时你仍然需要在数据库中cryptogrpahic功能。

您可以使用pgcrypto以访问SHA256这是SHA2家族的一员。 请记住sha0,SHA1 MD4和MD5是非常有问题, 绝不应使用密码哈希值。

以下是散列的口令的方法好吗:

digest("salt"||"password"||primary_key, "sha256")

该盐应是一个大的随机生成值。 这种盐应该受到保护,因为直到盐回收散列不能被打破。 如果要存储的盐在数据库中,然后就可以使用SQL注入,密码哈希一起获得。 串联主键是用来防止2人不必即使他们有相同的密码相同的密码哈希值。 当然,这个系统还有待改进,但是这是远远好于大多数系统我都看到了。

一般来说,最好是做散列在您的应用程序它击中数据库之前。 这是因为querys可以在日志中记录,如果数据库服务器拥有那么他们可以启用日志记录得到明文密码。



Answer 3:

实例和文档上: http://www.postgresql.org/docs/8.3/static/pgcrypto.html

UPDATE ... SET pswhash = crypt('new password', gen_salt('md5'));

SELECT pswhash = crypt('entered password', pswhash) FROM ... ;


文章来源: How can I hash passwords in postgresql?