2011-06-03 44 views
15

我有一個要求解密位於我的aspnet_Membership表中的加密(不是散列)密碼。在那個數據庫中,我看到了Password(加密)和PasswordSalt字段,並且可以查看我的web.config以查找machinekey> decryptionKey(validation =「SHA1」decryption =「AES」)。解密來自ASP.NET 2.0的'加密'密碼成員

注意:我很樂意使用Hashed密碼,但出於商業原因,我需要能夠使用會員的密碼,進入和從其他遠程系統使用SSO,因此使用Encrypted(絕對不使用Clear - yukky!)

鑑於所有這一切,肯定有一種方法來檢索密碼爲清晰,簡單和可讀的文本,即解密,但我真的很難找到任何網站,或在stackoverflow上的答案(和我在這裏查看所有「類似問題」和「類似題目的問題」),它解釋瞭如何做到這一點。

我發現MembershipProvider.DecryptPassword Method頁面,但我仍然無法解決如何在我的代碼中實際使用它。我還通過谷歌發現了其他頁面,但大多數密碼解密的例子似乎都沒有考慮salt和decrytionKey。

有沒有人有從他們各自的位置選擇密碼,passwordsalt和解密密鑰,並使用它們來解密ASP.NET 2.0成員資格加密密碼的直接示例?

+0

SSO的全部要點是委派的身份驗證,而不是共享登錄憑據。你的商業理由是傾斜的。 – 2011-06-03 19:51:05

+0

我不知道MembershipProvider是如何工作的,但並不是你有一個你不曾真正解密密碼的鹽漬密碼,你可以使用任何用戶輸入的密碼,將鹽加密方法,如果兩個加密結果匹配,則您被授予訪問權限。我懷疑你可以在沒有使用某種強力攻擊的情況下獲得明文密碼。 – 2011-06-03 19:54:22

+0

夥計們,我很欣賞這些評論,雖然業務邏輯可能存在偏差,但這項要求仍然存在。 ASP.NET MembershipProvider給出了「清除」,「加密」和「散列」格式的密碼選項,強烈建議'加密'密碼可以解密 - 只是發現我的問題。 – QMKevin 2011-06-03 19:58:47

回答

11

創建一個從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); 
}