我需要解密位于aspnet_Membership表中的加密(非哈希)密码。在该数据库中,我看到了Password(Encrypted)和PasswordSalt字段,我可以查看我的web.config以找到machinekey> decryptionKey(validation =“SHA1”decryption =“AES”)。
注意:我很乐意使用Hashed密码,但出于商业原因,我需要能够使用会员密码,SSO进出其他远程系统,因此使用加密(绝对不使用Clear) - yukky!)
考虑到所有这些,肯定有一种方法可以将密码检索为清晰,简单和可读的文本,即解密,但我在查找任何网站时遇到了麻烦,或者在stackoverflow上回答(我正在查看全部这里的“类似问题”和“类似标题的问题”解释了如何做到这一点。
我找到了MembershipProvider.DecryptPassword Method页面,但我仍然无法弄清楚如何在我的代码中实际使用它。我还通过谷歌发现了其他页面,但大多数密码解密的例子似乎都没有考虑到盐和解密密钥。
是否有人直接从各自的位置选择密码,passwordsalt和decryptionkey,并使用它们来解密ASP.NET 2.0成员资格加密密码?
答案 0 :(得分:13)
创建一个继承自SqlMembershipProvider的类,并在其中调用解密。
您需要的所有代码都可以在this article by 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); }