安全 – 如何哈希在postgresql的密码?

我需要hash一些密码用salt在postgresql,我没有能够找到任何相关的文档,如何做到这一点。

那么如何在postgresql哈希密码(有一些盐)?

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

推理

>不要使用md5。不要使用单个周期的sha-family快速哈希。快速哈希帮助攻击者,所以你不想要。
>使用资源密集型哈希,如bcrypt。 Bcrypt经过时间测试,并扩展到面向未来的能力。
>不要打扰你自己的盐,你可能调和自己的安全或可移植性,依靠gen_salt()来生成它独特的,每个使用盐自己。
>一般来说,不要白痴,不要尝试写自己的本土crypto,只是使用聪明的人提供了什么。

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

比较:传递给现有哈希:

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)

From-in-Php bcrypt散列是稍微优选的

在PHP 5.5及以上版本中有password_ *函数允许简单的密码哈希与bcrypt(约时间!),并有一个向下兼容性库下面的版本。一般来说,哈希值会回退到一个linux系统调用以降低CPU使用率,尽管你可能想确保它安装在你的服务器上。参见:https://github.com/ircmaxell/password_compat(要求php 5.3.7)

小心记录

注意,使用pg_crypto,密码在从浏览器到php到数据库的传输期间都是纯文本。这意味着如果你不小心你的数据库日志,他们可以从查询记录明文。例如有一个postgresql慢查询日志可以从正在进行的登录查询捕获和记录密码。

综上所述

使用php bcrypt如果可以,它会减少密码保持未破解的时间。尝试确保您的linux系统有bcrypt安装在它的crypt(),所以这是performant。强烈建议升级到至少php 5.3.7,因为php的实现从php 5.3.0到5.3.6.9略有bug,不适当地落回破坏的DES,没有在php 5.2.9和更低的警告。

如果你想/需要in-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

http://stackoverflow.com/questions/2647158/how-can-i-hash-passwords-in-postgresql

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:安全 – 如何哈希在postgresql的密码?