看来您已经知道如何解密密码并更改web.config文件,但您仍然坚持如何实施其余的过程。
使用ILSpy,这里是如何生成每个用户的盐:
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
表中的以下字段:
Password
- 1
PasswordSalt
- - 上述
PasswordFormat
计算上述
计算从来没有做过这样的事,但希望这会让你开始:)
您是否看到我对Greg的最终评论?我基本上完成了他的建议,但最终我显然错过了一些东西。不幸的是,他没有回应那个评论,并在那里结束。我想这足够让我不知道ASP.NET成员身份,因为我无法做到这一点。 – 2011-04-27 03:02:54
当你说“存储它”时,这是什么意思?通过会员提供商还是直接?我不清楚如何在不丢失现有数据的情况下做到这一点。你如何玩弄多个提供商并指定哪些是做什么的? – 2011-04-27 03:05:43
这个想法是,你想*丢失现有的数据(加密的密码)。根据上一篇文章中的评论,您希望使用MembershipUser.GetPassword()从加密提供程序获取当前密码。这是可能的,因为您正在使用可逆加密 - 该方法不适用于散列提供者)。一旦你有解密的密码,你想散列它(用盐)。这是一个单向过程。然后使用散列成员资格提供程序(实际上用散列覆盖加密密码)存储密码的结果散列。 (续) – 2011-04-27 19:41:19