我需要在postgresql上用salt散列一些密码,但我还没有找到任何关于如何实现这一点的相关文档.

那么,我如何在postgresql中散列密码(使用一些盐)?

推荐答案

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

推理

  • 不要使用md5.不要使用单一周期的sha家族快速哈希.快速哈希有助于攻击者,所以你不希望这样.
  • 使用资源密集型散列,比如bcrypt.Bcrypt经过时间考验,可扩展到future .
  • 不要费心自己动手做盐,你可能会搞砸自己的安全性或便携性,依靠gen_salt()来生成每种盐都是独一无二的.
  • 总的来说,不要做白痴,不要try 自己编写自己的加密程序,只使用聪明人提供的东西.

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)

在Php中,bcrypt散列稍微更可取

PHP5.5及以上版本中有password_*个函数,允许使用bcrypt进行简单的密码散列(大约是时候了!),下面的版本有一个向后兼容性库.Generally尽管您可能希望确保它安装在您的服务器上,但哈希还是会退回到包装linux系统调用以降低CPU使用率.参见:https://github.com/ircmaxell/password_compat(需要php 5.3.7+)

小心伐木

请注意,使用pg_crypto,密码在从浏览器传输到php和数据库的整个过程中都是明文的.这意味着,如果不小心处理数据库日志(log),可以从查询中记录in plaintext条日志(log).e、 g.拥有postgresql慢速查询日志(log)可以捕获并记录正在进行的登录查询中的密码.

总之

如果可以的话,可以使用php bcrypt,这样可以减少密码未被删除的时间.尽量确保你的linux系统已经安装了bcrypt,它的性能是crypt().强烈建议至少升级到PHP5.3.7+,因为php的实现在PHP5.3.0到5.3.6.9之间有一些缺陷,并且在PHP5.2.9及更低版本中,在没有警告的情况下,不适当地返回到断开的DES.

如果你想/需要postgres散列,安装bcrypt是一个不错的 Select ,因为默认安装的散列已经过时了(md5等).

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

Postgresql相关问答推荐

使用Spring data jpa和CriteriaQuery在jsonb列中搜索操作

Pogresql性能中的枚举与文本数据类型

GORM Golang SQL查询执行不区分大小写的搜索不起作用

自左联接的POSTGIS更新

gitlab在ubuntu上安装duplicate schema问题

查找行中的最小值

Rails:安装 pg gem 时出错

运算符不存在:integer = integer[] 在使用 ANY 的查询中

是否有 postgres CLOSEST 运算符?

声明变量set = select

如何使用 psql 执行 *.sql 文件

如何在 redshift 中对字段进行 GROUP BY 和 CONCATENATE

如何将 PostgreSQL 查询输出导出到 csv 文件

PostgreSQL 中是否有类似 zip() 函数的东西,它结合了两个数组?

Postgresql:备份所有表 struct ,但只备份少数数据表

PL/pgSQL 中的 BREAK 语句

在 pg_restore 期间排除表

重命名 Amazon RDS 主用户名

使用python将数据从csv复制到postgresql

Postgresql 用随机值更新每一行