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

sum*_*iet 7 .net c# sql-server hash

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

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

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

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

Mar*_*age 6

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

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

insert into MyTable values (0x123456789ABCDEF)
Run Code Online (Sandbox Code Playgroud)

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


Ica*_*rus 5

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

  • 您使用哪种哈希来生成字符串而不是咬序列?我所知道的所有具有密码功能的函数都会生成一定数量的位,例如128、160、256或512位,并且不是字符串(字符串使用编码存储)。 (2认同)