從 ASP.NET 2.0 成員資格中解密“加密”密碼
我需要解密我的 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); }