SQL筆記:關於MsSQL與.NET的SHA1雜湊分析
遇到了一個SHA1雜湊的問題,在.NET取出來的資料與在SQL拿到的編碼不一樣,因此進行了一些分析與筆記。
.NET的SHA1雜湊
一般來說,我與第三方單位工程師在溝通關於雜湊的話題時,我一律都會說,你去http://www.sha1-online.com/
丟字串進去,網站上顯示甚麼,我們就用那個為標準,之後要加甚麼鹽之類的之後再說,而這個網站其實用的編碼標準,就是UTF-8。
sha1-online.com | SHA1-String = "password"
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
基於這個觀念,因此在.NET端的實作就單純多了...
var aryByte = System.Text.Encoding.UTF8.GetBytes(cSHA1String);
var oSHA = new System.Security.Cryptography.SHA1Managed();
aryByte = oSHA.ComputeHash(aryByte);
Console.WriteLine(System.BitConverter.ToString(aryByte).Replace("-", ""));
C#輸出一樣是5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8
。
SQL的SHA1雜湊
焦點移到了SQL Server,翻查了一些文件可以很簡單的找到SHA1雜湊的函數,因此寫了下面這段測試:
DECLARE @Pwd NVARCHAR(MAX) = 'password';
SELECT CONVERT(NVARCHAR(MAX), HASHBYTES('SHA1', @Pwd), 2)
SQL的輸出是E8F97FBA9104D1EA5047948E6DFB67FACD9F5B73
,很顯然地與上述的認知不一樣。
會形成這樣的原因,是因為NVARCHAR在SQL裡面是以UTF-16的編碼來儲存(有此一說未求證:相容層級150以上UTF-16,150以下UCS-2),因此我們需要將編碼改成UTF-8來執行,才會得到相同雜湊字串。
DECLARE @Pwd NVARCHAR(MAX) = 'password';
SELECT CONVERT(NVARCHAR(MAX), HASHBYTES('SHA1', CONVERT(VARCHAR(MAX), @Pwd)), 2)
先轉VARCHAR再SHA1雜湊後,SQL的輸出5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8
已經與上述一致了。