我需要解密aspnet_Membership表中的加密(非哈希)密码。在该数据库中,我看到了Password(Encrypted)和PasswordSalt字段,并且我可以在web.config中查找machinekey>decryptionKey(validation="SHA1"decryption\="AES")。
注意:我很想使用哈希密码,但出于业务原因,我需要能够使用会员的密码,用于SSO进入和来自其他远程系统,因此使用加密(绝对不使用Clear-yukky!)
考虑到所有这些,肯定有一种方法可以将密码检索为清晰、易读的文本,即解密的文本,但我很难找到任何网站,也很难在stackoverflow上找到答案(我在这里查看了所有"类似的问题"one_answers"标题相似的问题"),这解释了如何做到这一点。
我已经找到了MembershipProvider.DecryptPassword方法页面,但我仍然不知道如何在代码中实际使用它。我也通过谷歌找到了其他页面,但大多数密码解密的例子似乎没有考虑salt和decryptionKey。
有没有人有一个直接的例子,可以从各自的位置选择密码、passwordsalt和decryptionkey,并使用它们来解密ASP.NET 2.0成员身份加密密码?
创建一个从SqlMembershipProvider继承的类,并在其中调用decrypt。
你需要的所有代码都可以在Naveen Kohli:的这篇文章中找到
在查看了反射器中的代码后,我发现微软提供者分两步解密。加密的密码实际上是加密数据的Base64转换。所以首先它将它从Base64,然后调用DecryptPassword方法。我只是做了最简单的事情复制了Microsoft实现中的代码,删除了所有检查它在做什么,然后使用它。下面的类是从SqlMembershipProvider派生的类,其方法仅以明文形式返回给定加密密码的密码。
namespace MembershipPasswordRecover { public class NetFourMembershipProvider : SqlMembershipProvider { public string GetClearTextPassword(string encryptedPwd) { byte[] encodedPassword = Convert.FromBase64String(encryptedPwd); byte[] bytes = this.DecryptPassword(encodedPassword); if (bytes == null) { return null; } return Encoding.Unicode.GetString(bytes, 0x10, bytes.Length - 0x10); } } } static void Main(string[] args) { var passwordManager = new NetFourMembershipProvider(); var clearPWd = passwordManager.GetClearTextPassword("encryptedpasswordhere"); Console.WriteLine(clearPWd); }