2010-05-31 42 views
5

改變我目前正在和我的一個項目升級從.NET 3.5到.NET 4.0SHA1CryptoServiceProvider在.NET 4

一切都進行得非常好,所有的代碼編譯,所有的測試通過。
然後我遇到了部署到我的臨時環境的問題。
突然我的登錄不再有效。

看來我的SHA1哈希密碼被散列在不同的.NET 4

我使用SHA1CryptoServiceProvider:

SHA1CryptoServiceProvidercryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 

爲了測試我創建了一個新的Visual Studio項目,2個控制檯應用程序。
第一個針對.NET Framework 3.5,第二個針對.NET 4.0。
我在兩者中運行完全相同的哈希代碼,生成不同的結果。

爲什麼會發生這種情況,我該如何解決這個問題?
我顯然不能去更新我的所有用戶的密碼的考慮,我不知道它們是什麼。

任何幫助將不勝感激。

代碼示例

public static class SHA1Hash 
{ 

    public static string Hash(string stringToHash) 
    { 
     return (Hash(stringToHash, Encoding.Default)); 
    } 

    public static string Hash(string stringToHash, Encoding enc) 
    { 
     byte[] buffer = enc.GetBytes(stringToHash + stringToHash.Reverse()); 
     var cryptoTransformSHA1 = new SHA1CryptoServiceProvider(); 
     string hash = BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)); 
     return hash; 
    } 
} 
+0

的[升級後,登錄失敗ASP.net 4.0 3.5(可能重複http://stackoverflow.com/questions/2739196/login -fails-after-upgrade-asp-net-4-0-from-3-5) - 解決方案包括 – 2010-05-31 20:49:25

+0

不幸的是,這不是一回事。這與FormsAuthenticationCookies和ViewState有關,只是「如果運行混合ASP.NET 2.0/ASP.NET 4」時出現問題。 但是我認爲這是我的解決方案 – WebDude 2010-05-31 21:03:12

+0

你能清理AsymetricHash/Hash混淆嗎?只是爲了安全。 – 2010-05-31 21:11:20

回答

2

一個評論的帶領我到找到我的代碼中的錯誤。
創建我的字節數組當被散列,我試圖字符串以自身的反向版本追加。

E.g.給予「密碼」散列我真的哈希「passworddrowssap」

但是我的代碼有輕微的錯誤在裏面:

.Reverse()是可以逆轉的字符串LINQ的擴展方法。
但是它並沒有返回一個字符串,它返回:

IEnumerable<Char> 

這種類型調用的ToString()實際上返回:

System.Linq.Enumerable + d__99`1 [系統。字符]

做同樣的事情在.NET 4.0中的回報

小號ystem.Linq.Enumerable + d__a0`1 [System.Char]

因此,我的密碼被不同地散列。
我應該做的字節數組創建爲:

byte[] buffer = enc.GetBytes(stringToHash + new String(stringToHash.Reverse().ToArray())); 
0

聽起來像它可能是字符編碼的問題。確保被散列的字符串是在編碼[UTF-8,ANSI等]你希望(如果是,請確保舊環境太。)

-Oisin

+0

我一直在使用Encoding.Default。 我試過指定一個編碼,但以下都沒有工作: Encoding.ASCII,Encoding.BigEndianUnicode,Encoding.Unicode,Encoding.UTF32,Encoding.UTF7,Encoding.UTF8 – WebDude 2010-05-31 20:54:46

+0

散列在字節流級別工作 - 我是不知道你是否瞭解我。你指定編碼在哪裏?重要的是這兩個系統都被驗證爲向sha1類提供相同的_bytes_。 – x0n 2010-05-31 21:05:02

+0

請參閱我調用的方法的代碼示例。 這兩個網站都運行在完全相同的服務器上,所以我不確定編碼的變化。我如何驗證這兩個系統是否向sha1類輸入相同的字節? 根據我上面的代碼示例,我可以只檢查buffer.Length? – WebDude 2010-05-31 21:08:11