postgresql - 搜索非散列数据
问题描述
我有一个用户表,其中包含使用 md5 哈希的密码列。随着时间的推移,它的一些散列被更改为纯文本(用户要求立即更改密码,而不使用应用散列的方法)。
我有少量的数据,我会手工完成,但我想知道:有一些类似的东西
select * from TableName where Column is not hashed
或者
update from TableName
set Column = md5(current value)
where Column is not hashed
或类似的东西?
解决方案
如前所述,官方强烈反对使用 MD5 对私有凭证进行哈希处理或在身份验证和授权过程中使用。
但是,检测字段是否存储 MD5 值或非散列值并即时转换它的最佳机会如下:
UPDATE TableName
SET Column = md5(Column)
WHERE Column !~ '^[a-f0-9]{32}$'
如果某个非常聪明的人生成了某个东西的 MD5 哈希值并直接将其用作密码,则可能还有剩余的。这将无法检测到,但在这种情况下身份验证必须失败,因为存储的值与登录时输入的密码的 MD5 散列不匹配。
您也不应该考虑将纯文本密码传输到数据库进行散列和比较,因为攻击面确实已经很高了。即使您在数据库连接中使用了不错的 TLS,谁能保证管理员或攻击者没有直接在数据库中启用使用参数记录慢速语句?
相反,应用程序应该使用库直接生成盐和盐散列密码,并且只将盐和散列传输到存储。crypt指定的格式是行业接受的(因此强烈推荐),有适用于任何编程语言的可靠库,一旦某个算法被弃用,您可以增量更改它而无需协调的一次性升级。
推荐阅读
- lazy-loading - jQuery.Lazy Vimeo 问题
- spring - 社交媒体,如 Spring Boot 中的个人资料页面 URL
- java - InvalidAlgorithmParameterException: IV 必须在 CBC 模式下指定
- webpack - aurelia 为 prod 构建时 IE 加载缓慢,但在为 dev 和 stage 构建时并不慢
- c - 如何在 C 中创建真正的随机数(IDE:MPLAB)
- c# - 创建我自己的控件
- java - 在 Java 中使用 TimeUnit 转换的性能下降
- java - 如何使用嵌入式 tomcat 减少 Spring Boot 应用程序的内存使用?
- javascript - 在 JS 中获取属性值 - 最快的方法
- php - 在 PHP 中同时进行运算符和赋值?