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

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

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

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

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

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

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

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

 insert into MyTable values (0x123456789ABCDEF) 

对您的问题不是一个真正的答案,但如果您在实施自己的密码function时遇到困难,可以考虑使用预建的工业强度组件来避免将来出现尴尬错误。 例如,ASP.NET有一个成员资格提供者 。