更改预先存在的数据库上的散列函数

dig*_*nie 5 security passwords hash md5 sha

我正在阅读有关密码哈希的一些内容.我见过SHA-256> MD5.这让我思考应用程序如何处理从一个哈希函数到另一个哈希函数的更改.如果有人使用MD5实现一个哈希密码的应用程序,会发生什么.然后他们决定使用SHA-256.但是,当然存储在数据库中的密码哈希值是在MD5中.

将数据库中的数据从一个散列函数迁移到另一个散列函数的过程是什么?

Tho*_*nin 5

不可能"unhash"密码(至少不能以一般,有效和可靠的方式 - 你可以猜出一些密码,这是攻击者所做的,你想要从MD5迁移,因为攻击者可能会有一些成功).因此,迁移将随着时间的推移而扩展:一些密码将使用MD5进行哈希处理,其他密码将使用SHA-256进行哈希处理.要验证密码时:

  • 如果已知该密码的SHA-256,则使用SHA-256.此密码已迁移.
  • 否则,MD5用于检查密码.如果匹配,则密码良好,并且由于此时应用程序已知密码,因此应用程序还使用SHA-256对密码进行哈希处理,并将MD5哈希值替换为数据库中的SHA-256哈希值.

因此,密码是动态迁移的; 要完全摆脱MD5,你必须等待很长时间和/或销毁长时间未访问过的帐户.您需要能够区分MD5哈希与SHA-256哈希,这很容易,因为它们具有不同的大小(MD5为16字节,SHA-256为32字节).你也可以添加一面旗帜或任何其他类似的噱头.

请注意,使用散列函数的原始单个应用程序散列密码是一种非常糟糕的方法,在安全方面,并且用SHA-256替换MD5不会真正改善.您对密码进行哈希处理,以便获得对数据库的读访问权限的攻击者不会自己学习密码.为了真正防止攻击者猜测密码,您还需要"盐"(每个密码随机数据,与散列密码一起存储)和适当慢的散列函数(即数千甚至数百万的嵌套散列函数调用).有关详情,请参阅此答案.简短的回答:既然你正在设想迁移,那就做聪明的事情并迁移到bcrypt,而不是SHA-256(参见security.stackexchange 上的答案).