2013-07-23 40 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