Asp.net

從 ASP.NET 2.0 成員資格中解密“加密”密碼

  • June 3, 2011

我需要解密我的 aspnet_Membership 表中的加密(非散列)密碼。在該數據庫中,我看到 Password (Encrypted) 和 PasswordSalt 欄位,我可以查看我的 web.config 以找到 machinekey > decryptionKey (validation=“SHA1” decryption=“AES”)。

注意:我很想使用散列密碼,但出於商業原因,我需要能夠使用會員的密碼,用於 SSO 進出其他遠端系統,因此使用加密(絕對不使用 Clear - yukky!)

鑑於這一切,肯定有一種方法可以將密碼檢索為清晰、純文字和可讀的文本,即解密,但我很難找到任何網站,或者在 stackoverflow 上回答(我正在查看所有“類似問題”和“具有相似標題的問題”),解釋瞭如何做到這一點。

我找到了MembershipProvider.DecryptPassword 方法頁面,但我仍然無法弄清楚如何在我的程式碼中實際使用它。我還通過 Google 找到了其他頁面,但大多數密碼解密範例似乎都沒有考慮到 salt 和 decrytionKey。

有沒有人有從各自位置選擇密碼、密碼鹽和解密密鑰並使用它們來解密 ASP.NET 2.0 成員身份加密密碼的直接範例?

創建一個繼承自 SqlMembershipProvider 的類,您可以在其中呼叫解密。

您需要的所有程式碼都可以在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);
}

引用自:https://stackoverflow.com/questions/6231942