2008-12-05 38 views
7

我正在ASP.NET MVC中重寫一個PHP網站。我想保持相同的用戶羣,但密碼使用PHP crypt()函數進行散列處理。我需要.Net中的相同功能,以便我可以在登錄時散列密碼,並根據用戶數據庫中的散列密碼進行檢查。.net中的crypt()函數?

隱窩在這種情況下使用CRYPT_MD5實現 - 哈希全部以$ 1 $

我試過Phalanger,但它並沒有crypt函數的MD5實現。

有沒有人知道.Net中的一個? CodeProject上crypt()的C#示例使用DES,而不是MD5。

我在C#中嘗試了以下代碼,使用不同的鹽+密碼,密碼+鹽和鹽以及不帶$ 1 $前綴和$後綴的排列組合。沒有給出相同的結果,PHP:

static void Main(string[] args) 
{ 
    const string salt = "somesalt"; 
    const string password = "fubar"; 
    const string plaintextString = password + salt; 
    byte[] plaintext = GetBytes(plaintextString); 
    var md5 = MD5.Create("MD5"); 
    byte[] hash = md5.ComputeHash(plaintext); 
    string s = System.Convert.ToBase64String(hash); 
    Console.WriteLine("Hash of " + password + " is " + s); 
    Console.ReadKey(); 
} 

private static byte[] GetBytes(string s) 
{ 
    var result = new byte[s.Length]; 
    for (int i = 0; i < s.Length; i++) 
     result[i] = (byte)s[i]; 
    return result; 
} 
+0

MD5一個微不足道的PHP腳本不被認爲是安全散列,你可能希望將系統升級到SHA-256。 – TravisO 2009-01-19 23:22:17

+0

btw,`控制檯。WriteLine(「{0}的哈希是{1}」,密碼,s);' – abatishchev 2010-07-26 05:51:07

回答

0

我發現的唯一的解決辦法是調用簡單地執行輸入字符串的哈希值,並返回它:-(

2

有針對MD5哈希幾個.NET方法,System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, format)是最容易使用的,即使它是一口。只需傳遞「md5」作爲格式即可。

取決於PHP如何做這件事,它可能就像在導入它時從散列的開頭砍掉$1$一樣簡單。它可能更復雜。如果你可以發佈一個示例密碼/哈希,我會看看我是否可以想出一些C#,它會爲你生成相同的哈希密碼。

0

我目前的工作完全一樣的問題。我想出瞭解決的辦法是直接通過一個外部調用調用PHP函數:

[DllImport("php5ts.dll", EntryPoint = "crypt", CharSet = CharSet.Ansi)] 
private static extern string crypt(string str, string salt); 

運行時,本地Webdev的服務器,IIS5和IIS6但如果你使用的II7對於這個版本的PHP 5.2.10效果很好ASP.Net工作進程崩潰,未處理的異常。 (我會盡快更新我的答案)

我們還包括一個密碼類型標誌,允許我們爲所有新用戶使用.Net MD5實現,並在現有用戶無縫轉換時更新他們細節。

更新:直接從IIS7引用php5ts.dll的問題似乎很可能是使用64位窗口,所以此解決方案可能在32位Windows 7或Server 2008安裝上工作,但我無法來驗證這一點。事實證明,我們現有的網站使用DES,所以我們能夠使用CodeProject的crypt實現,感謝參考Mike。

相關問題