【问题标题】:How can I store a hash in a SQL Server database using C#?如何使用 C# 在 SQL Server 数据库中存储哈希?
【发布时间】:2012-02-13 20:26:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • 哈希可以是 varchar...它根本不必是二进制的,但出于好奇,您使用的 has 函数是什么?
  • 为什么不想使用base64?很简单,数据小到不用担心大小。
  • Base64 是将哈希保留为人类可读形式的最安全方法。将加盐哈希存储为纯文本并没有错;这就是存储哈希而不是密码的全部目的。
  • 好吧,我正在使用 SHA-512 对密码进行哈希处理,如下所示:byte[] pwdEntered = pw512.ComputeHash(System.Text.Encoding.Unicode.GetBytes(pwBox.Text));,而我放入数据库的值就是这样的结果:Convert.ToBase64String(pwdEntered)。 @Chris - 并不是我不想使用 base64,只是这是我第一次这样做,所以我不确定这是否是一种可以接受的方式,或者是否有其他奇特的方式这样做。
  • 这个问题与认证无关。应该是“如何将二进制数据插入表中”。

标签: c# .net sql-server hash


【解决方案1】:

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

通常,您用于读取和写入数据库的任何 API 都应该可以帮助您读取和写入二进制数据。但是,也许您想使用一些 SQL 将二进制值直接插入到表中。您可以使用如下语法:

insert into MyTable values (0x123456789ABCDEF)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你使用什么样的哈希来生成字符串而不是序列?我所知道的所有加密功能都会生成一定数量的位,例如 128、160、256 或 512 位,这不是字符串(字符串使用编码存储)。
    • @MartinLiversage 我使用 MD5 哈希将密码存储在 varchar 字段中,没有问题。 Linux 在 /etc/passwords 中使用了 MD5 哈希很长时间。关键是您不必将它们存储在 varbinary 字段中。
    • 当然您可以将哈希值存储在varchar 列中,但是您需要使用base64 编码之类的方式对其进行编码。您的回答似乎表明可以直接存储哈希,而无需考虑在字符串中没有意义的随机二进制序列。
    • 很抱歉一直吹毛求疵,但您不能使用 UTF-8 编码将任何字节序列转换为字符串。尝试将字节 0xC5 0x01 转换为字符串,然后使用 UTF-8 转换回字节。因为字节是无效的 UTF-8,所以您无法取回原始字节。不过 Base64 没问题。
    • @martinLiversage au contraire,感谢您提供的信息。我不知道。从答案中删除了 UTF-8。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多