2013-07-23 75 views
1

加密算法是md5。如何使用sql server生成類似的哈希密碼?

在C#中,我使用下面的代碼來生成密碼: -

private MD5 _md5; 
var plain = ASCIIEncoding.Default.GetBytes('admin'); 
var hashed = _md5.ComputeHash(plain); 
var shashed = ASCIIEncoding.Default.GetString(hashed); 
Console.Write(shashed); 

結果是:!#/)zW¥§C‰JJ€Ã

當我使用SQL Server的代碼來生成密碼: -

DECLARE @HashThis varchar(100); 
SELECT @HashThis = CONVERT(varchar(100),'admin'); 
SELECT HASHBYTES('MD5', @HashThis); 
GO 

結果是:0x21232F297A57A5A743894A0E4A801FC3

我正在使用相同的算法。我如何在SQL Server中生成相同的哈希值?

+6

MD5不是安全的,特別是沒有鹽。您應該使用bcrypt或PBKDFv2。 – SLaks

+0

您在SQL中看到的是十六進制表示形式,其中隨着C#代碼將字節值寫入控制檯,您將在字體中獲得這些字節值的表示形式。 將密碼存儲在SQL中是一種常見的做法,並且足夠安全,因爲您希望在登錄期間比較計算得到的來自密碼的哈希值。如果你使用加密,那麼你開放的人可以解密的密碼,作爲一個哈希值必須被蠻力 – Quintium

+1

而MD5是**不**密碼學 - 它是哈希。 –

回答

0

你是否檢查過一個字符集表的結果;

在大多數charactersets,爲0x21是!,0×23是#等

1

你的C#代碼和SQL代碼都計算相同的散列值,但SQL是格式化的結果作爲一個十六進制字符串,而你的C#代碼試圖將散列值的字節直接轉換爲ASCII字符(它們不是)。爲了獲得在C#中相同的結果,你可以使用BitConverter類:

var shashed = "0x" + System.BitConverter.ToString(hashed).Replace("-", ""); 

輸出:

0x21232F297A57A5A743894A0E4A801FC3