首页 > 解决方案 > 搜索非散列数据

问题描述

我有一个用户表,其中包含使用 md5 哈希的密码列。随着时间的推移,它的一些散列被更改为纯文本(用户要求立即更改密码,而不使用应用散列的方法)。

我有少量的数据,我会手工完成,但我想知道:有一些类似的东西

select * from TableName where Column is not hashed

或者

update from TableName 
   set Column = md5(current value) 
where Column is not hashed 

或类似的东西?

标签: postgresqlhash

解决方案


如前所述,官方强烈反对使用 MD5 对私有凭证进行哈希处理或在身份验证和授权过程中使用。

但是,检测字段是否存储 MD5 值或非散列值并即时转换它的最佳机会如下:

UPDATE TableName
SET Column = md5(Column)
WHERE Column !~ '^[a-f0-9]{32}$'

如果某个非常聪明的人生成了某个东西的 MD5 哈希值并直接将其用作密码,则可能还有剩余的。这将无法检测到,但在这种情况下身份验证必须失败,因为存储的值与登录时输入的密码的 MD5 散列不匹配。

您也不应该考虑将纯文本密码传输到数据库进行散列和比较,因为攻击面确实已经很高了。即使您在数据库连接中使用了不错的 TLS,谁能保证管理员或攻击者没有直接在数据库中启用使用参数记录慢速语句?

相反,应用程序应该使用库直接生成盐盐散列密码,并且只将盐和散列传输到存储。crypt指定的格式是行业接受的(因此强烈推荐),有适用于任何编程语言的可靠库,一旦某个算法被弃用,您可以增量更改它而无需协调的一次性升级。


推荐阅读