将ASP.NET成员密码从加密转换为哈希

时间:2011-04-27 02:20:05

标签: asp.net asp.net-membership password-protection

我开发了一个使用ASP.NET成员资格的网站。根据之前网站的评论,我决定加密密码,以便忘记密码的用户可以恢复密码。

然而,新网站(现在有超过500名注册用户)给我一些批评,认为行业标准真的是哈希密码。

然而,经过相当广泛的搜索,我无法找到任何有关如何将现有用户的密码从加密转换为哈希的信息。

我知道我可以更改web.config文件,新用户的密码将使用新格式。但它无法更新现有用户。

注意:我之前曾问过一个类似的问题,但大多数时候只是讨论哪个更好,加密或散列。我已经过了那个讨论,但我一直无法找到一种方法来转换它们而不会丢失已经注册的数百名用户。

3 个答案:

答案 0 :(得分:3)

您似乎已经知道如何解密密码并更改web.config文件,但您仍然坚持如何实现其余的流程。

使用ILSpy,以下是为每个用户生成salt的方法:

byte[] array = new byte[16];
new RNGCryptoServiceProvider().GetBytes(array);
return Convert.ToBase64String(array);    

一旦你有盐,这里是如何生成密码:

byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] array = Convert.FromBase64String(salt);
byte[] array2 = new byte[array.Length + bytes.Length];
Buffer.BlockCopy(array, 0, array2, 0, array.Length);
Buffer.BlockCopy(bytes, 0, array2, array.Length, bytes.Length);   
using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) {
  return Convert.ToBase64String(sha1.ComputeHash(array2));
}

其中pass是您计算的纯文本密码salt是在上面第一个代码段中计算的字符串。 default algorithm is SHA1,如果你想知道为什么要使用它。

由于这是一次性过程,我会编写一个HTTP处理程序,以便在短暂的计划维护期间手动更新数据库 - 希望您有这种奢侈。 (显然先备份并测试)。您需要更新aspnet_Membership表中的以下字段:

  1. Password - 上面计算
  2. PasswordFormat - 1
  3. PasswordSalt - 上面计算
  4. 从来没有做过这样的事情,但希望这会让你开始:)

答案 1 :(得分:1)

也许我在这里遗漏了一些东西,但它应该很简单。创建一个解密密码的进程,然后相应地生成盐,并将salt +用户的解密密码的哈希值存储在数据库中。显然,您不希望对用户的加密密码进行哈希处理。别忘了储存盐。

答案 2 :(得分:1)

恕我直言,Greg对您上一个问题(Changing passwordFormat from Encrypted to Hashed)的回复(以及相关评论)是要走的路。基本上,你想:

  1. 添加散列成员资格提供程序
  2. 遍历所有加密密码用户
  3. 每个人都解密密码,创建哈希值,存储它,从数据库中删除加密版本,然后继续。
  4. 完成后,应将所有加密密码用户转换为哈希值。