2012-02-12 66 views
5

我正在尝试使用登录/注销功能创建网站,并计划正确散列和腌制密码。然而,我面临的问题是我如何将密码存储在数据库中。我知道我需要在数据库中存储散列+密码(不是纯文本或纯文本加密),但我不知道如何在技术上将二进制数据插入到数据库中。如何将散列存储在使用C#的SQL Server数据库中?

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

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

如果我没有任何意义,请要求澄清,我会尽快与您联系。

+1

散列可以是一个varchar ...它不必是二进制的,但出于好奇心你使用的has函数是什么? – hackartist 2012-02-12 21:25:33

+1

为什么你不想使用base64?这很简单,数据足够小,不用担心大小。 – 2012-02-12 21:31:32

+0

Base64是最安全的方式,它将散列以可读的形式存在。将腌制散列存储为纯文本没有任何问题;这就是存储散列而不是密码的全部目的。 – Douglas 2012-02-12 21:34:37

回答

3

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

+2

你使用什么样的散列生成字符串而不是序列的叮咬?所有加密函数都具有我知道的函数将生成128,160,256或512位等一定数量的位,并且不是字符串(字符串使用编码存储)。 – 2012-02-12 21:51:09

+0

@MartinLiversage我已经使用MD5哈希来存储密码在varchar字段不存在问题。 Linux在/ etc /密码中使用了MD5哈希来保存时间。关键是你不必将它们存储在varbinary字段中。 – Icarus 2012-02-12 22:55:13

+1

当然,你可以在'varchar'列中存储散列,但是你需要使用类似base64编码的东西对它们进行编码。你的答案似乎表明,散列可以直接存储,而不必考虑在字符串中没有意义的随机二进制序列。 – 2012-02-13 06:16:05

6

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

通常情况下,无论你用什么API来读写数据库应该帮助您在读取和写入二进制数据。但是,也许你想使用一些SQL直接插入一个二进制值到表中可以使用的语法如下:。

insert into MyTable values (0x123456789ABCDEF) 

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

相关问题