我有一个用户表,其中的密码列使用md5哈希。随着时间的流逝,它的某些哈希值已更改为纯文本(用户要求立即更改密码,而未使用会应用哈希的方法)。
我的数据量很少,我会手工处理,但是我想知道:
select * from TableName where Column is not hashed
或
update from TableName
set Column = md5(current value)
where Column is not hashed
还是类似的东西?
答案 0 :(得分:0)
如前所述,将MD5用于散列专用凭据或在身份验证和授权过程中以其他方式使用{5}是正式的highly discouraged。
但是,检测字段是存储MD5值还是非哈希值并即时对其进行转换的最佳机会如下:
UPDATE TableName
SET Column = md5(Column)
WHERE Column !~ '^[a-f0-9]{32}$'
如果有人真的很聪明的人生成了某个东西的MD5哈希并将其直接用作密码,则可能还有剩余。这将无法检测到,但是在这种情况下,身份验证必须失败,因为存储的值与登录时输入的密码的MD5哈希值不匹配。
您还应该不要考虑将纯文本密码传输到数据库中进行哈希和比较,因为攻击面确实已经很高。即使您为数据库连接使用了不错的TLS,谁还能保证管理员或攻击者未启用直接在数据库中记录带参数的 slow 语句?
相反,应用程序应使用库直接生成盐值和哈希值的密码,并且仅将盐值和哈希值传输到存储中。 crypt指定的格式已为业界所接受(因此强烈建议使用),对于任何编程语言都有可靠的库,并且不赞成使用某种算法后,就可以进行增量更改,而无需协调的单次升级。 / p>