如何将密码哈希从MD5转换为SHA?

Bru*_*man 15 passwords hash md5 sha

我有一个旧的应用程序,其用户密码存储在数据库中,带有MD5哈希.我想用SHA-2系列中的东西替换它.

我想到了两种可能的方法来实现这一点,但两者看起来都很笨重.

1)添加一个布尔"标志"字段.用户在此之后第一次进行身份验证时,使用SHA密码哈希替换MD5密码哈希,并设置该标志.然后我可以检查标志以查看密码哈希是否已被转换.

2)添加第二个密码字段以存储SHA哈希.用户第一次在此之后进行身份验证,使用SHA散列密码并将其存储在新字段中(可能同时删除其MD5哈希值).然后我可以检查SHA字段是否有值; 这基本上成了我的旗帜.

在任何一种情况下,对于不经常登录的任何用户,MD5身份验证都必须保留一段时间.任何不再活动的用户永远不会切换到SHA.

有一个更好的方法吗?

Jør*_*ode 11

基本上相同,但可能比添加额外字段更优雅:在Django的默认身份验证框架中,密码哈希存储为如下构造的字符串:

hashtype$salt$hash
Run Code Online (Sandbox Code Playgroud)

Hashtype是sha1或md5,salt是用于加密原始密码的随机字符串,最后是哈希本身.示例值:

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您通过首先MD5创建未来的密码,可以将所有MD5字符串转换为SHA1,方法是在数据库中重新编写它们.检查密码也需要首先MD5,但我不认为这是一个很大的打击.

php-code(登录):

prev:$ login =(md5($ password)== $ storedMd5PasswordHash);

之后:$ login =(sha1(md5($ password))== $ storedSha1PasswordHash);

也与盐腌一起工作,从这里得到了最初的想法.