如何使用C#在SQL Server数据库中存储哈希?

时间:2012-02-12 21:23:16

标签: c# .net sql-server hash

我正在尝试创建一个具有登录/注销功能的网站,并且我计划正确散列并保存密码。然而,我面临的问题是如何将密码存储在数据库中。我知道我需要将散列+盐渍密码存储在数据库中(不是以纯文本或纯文本加密),但我不知道如何从技术上将二进制数据插入到数据库中。

在我早期的尝试中,我可以获取数据库中数据的唯一方法是将二进制数据转换为base64字符串并插入varchar密码字段,但有些事情告诉我这不是正确的方法。

数据库中的密码字段目前是varchar但据我所知,散列密码是二进制的。所以,即使我将密码字段更改为二进制对象,我仍然不知道如何实际插入它!

如果我没有任何意义,请要求澄清,我会回复你。

2 个答案:

答案 0 :(得分:6)

在Microsoft SQL Server中,您可以将二进制数据存储在具有binary数据类型的列中(如果需要可变长度数据,则可以存储varbinary)。您可以将它用于散列密码和盐渍密码。如果您使用512位散列函数并且还想使用512位盐,则需要2 * 512/8 = 128字节(例如binary(128)来存储salt和hash。

通常,用于读写数据库的API都可以帮助您读取和写入二进制数据。但是,您可能希望使用某些SQL直接将二进制值插入表中。您可以使用以下语法:

insert into MyTable values (0x123456789ABCDEF)

对您的问题不是一个真正的答案,但如果您努力实施自己的密码功能,您可以考虑使用预建的工业强度组件来避免将来出现尴尬错误。例如ASP.NET has a membership provider

答案 1 :(得分:4)

不,散列密码不必存储在varbinary字段中,您可以对其进行编码并将其存储在varchar字段中。 Base64是编码任何类型字符的不错选择。