我有一個SQL表,其中存儲了大字符串值,該值必須是唯一的。 爲了確保唯一性,我在一個列中存儲唯一的索引,其中存儲大字符串的MD5哈希的字符串表示形式。計算一個UTF8字符串的MD5哈希
,節省了這些記錄的C#應用程序使用下面的方法做散列:
public static string CreateMd5HashString(byte[] input)
{
var hashBytes = MD5.Create().ComputeHash(input);
return string.Join("", hashBytes.Select(b => b.ToString("X")));
}
爲了調用此,我首先使用UTF-8編碼轉換string
到byte[]
:
// this is what I use in my app
CreateMd5HashString(Encoding.UTF8.GetBytes("abc"))
// result: 90150983CD24FB0D6963F7D28E17F72
現在我想能夠在SQL中實現這個散列函數,使用HASHBYTES
function,但我得到一個不同的值:
print hashbytes('md5', N'abc')
-- result: 0xCE1473CF80C6B3FDA8E3DFC006ADC315
這是因爲SQL計算字符串的UTF-16表示形式的MD5。 我在C#中得到了相同的結果,如果我這樣做CreateMd5HashString(Encoding.Unicode.GetBytes("abc"))
。
我不能改變哈希在應用程序中完成的方式。
有沒有辦法讓SQL Server計算字符串的UTF-8字節的MD5哈希?
我查了類似的問題,我嘗試使用排序規則,但迄今沒有運氣。
我只是昨晚還挺同樣的事情..我想你用它來存儲密碼和檢查登錄...爲什麼你不改變你的邏輯讓C#使用MD5並再次將其轉換爲散列,然後檢查它是否存儲在數據庫中的字符串相同? – Veljko89
@ Veljko89 MD5 [不適用](http://security.stackexchange.com/a/19908/4304)用於密碼。我建議你避免它。 – GolfWolf
但是要在任何網站上進行實際測試,有防禦措施,5次嘗試後超時等等......沒有網站可以處理這些登錄量。甚至要找到某個人的密碼,任何人都有機會找出20個字符串作爲鹽添加? – Veljko89