从ASP.NET 2.0成员身份解密“加密”密码

时间:2011-06-03 19:48:40

标签: asp.net .net-2.0 passwords asp.net-membership encryption

我需要解密位于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成员资格加密密码?

1 个答案:

答案 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);
}