【问题标题】:Decrypting an 'Encrypted' password from ASP.NET 2.0 Membership从 ASP.NET 2.0 成员资格中解密“加密”密码
【发布时间】:2011-09-08 02:01:52
【问题描述】:

我需要解密我的 aspnet_Membership 表中的加密(非散列)密码。在该数据库中,我看到 Password (Encrypted) 和 PasswordSalt 字段,我可以查看我的 web.config 以找到 machinekey > decryptionKey (validation="SHA1" decryption="AES")。

注意:我很想使用散列密码,但出于商业原因,我需要能够使用会员的密码,用于 SSO 进出其他远程系统,因此使用加密(绝对不使用清除- 哎呀!)

鉴于所有这些,肯定有一种方法可以将密码检索为清晰、纯文本和可读文本,即解密,但我在查找任何网站或在 stackoverflow 上回答时遇到了真正的麻烦(我正在查看所有此处的“类似问题”和“具有类似标题的问题”)解释了如何做到这一点。

我找到了MembershipProvider.DecryptPassword Method 页面,但我仍然无法弄清楚如何在我的代码中实际使用它。我还通过 Google 找到了其他页面,但大多数密码解密示例似乎都没有考虑到 salt 和 decrytionKey。

有没有人从各自的位置选择密码、密码盐和解密密钥并使用它们来解密 ASP.NET 2.0 成员身份加密密码的直接示例?

【问题讨论】:

  • SSO 的全部意义在于委托身份验证而不是共享登录凭据。您的业​​务原因存在偏差。
  • 我不知道 MembershipProvider 是如何工作的,但是拥有一个你从来没有真正解密密码的加盐密码并不是重点,你可以使用任何用户输入密码,以任何加密方法应用盐,如果两个加密结果匹配,您将被授予访问权限。我怀疑您是否真的可以在不使用某种暴力攻击的情况下获得明文密码。
  • 伙计们,我很欣赏 cmets,虽然业务逻辑可能存在偏差,但需求仍然存在。 ASP.NET MembershipProvider 为密码提供了“清除”、“加密”和“散列”格式选项,强烈建议可以解密“加密”密码 - 只是找出我的问题。
  • @QMKevin:除非它是单向加密,它就是。如果要实现可解密密码,您可能必须实现自定义 MembershipProvider。不过老实说,这是个坏主意。
  • @Cory 很抱歉不同意(我保证更多的是出于挫折和学习的愿望),但我已经阅读了加密密码确实可以解密,而哈希不能。我读到了here Huh,我也刚刚在此链接上发现了一种声称可以让您将编码密码转换回其可读格式的方法。不知道为什么我以前没有看到这个。我的谷歌搜索技能假设它是周末,也许。希望这行得通!

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


【解决方案1】:

创建一个继承自 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);
}

【讨论】:

  • 可以在.Net v5 中访问SqlMembershipProvider 吗?如果没有,如何在.Net v5中完成密码解密?
  • @MikeW 如果您的目标是解密密码以迁移到 Identity Server 和 .NET 5,那么您可以在任何版本的 .NET SqlMembershipProvider 中编写一个 .NET 应用程序,获取使用 Adam 的方法获取明文密码,然后将它们传递给 Identity Server 进行散列 + 加盐。
猜你喜欢
  • 2017-03-31
  • 2011-03-02
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多