【问题标题】:What is a good way of storing hashed passwords for easy reading/manupulation during tests什么是存储散列密码以便在测试期间轻松阅读/操作的好方法
【发布时间】:2015-08-11 09:19:37
【问题描述】:

我有一个 C# 应用程序和一个数据库。在这个数据库中,我存储散列密码,我想知道这样做的最佳方法是什么?

我的选项似乎是 varbinary(160)。这样做的好处是二进制数据是内部内容的直接表示。缺点是更改不是那么容易(尝试手动更改数据库管理器中的字段会导致抱怨 ntext != varbinary)。另一种选择是将其存储为字符串,但这会导致包含一些非常奇怪的字符,我担心它最终可能会包含一些危险的控制字符,这是一种风险吗?什么是好的数据类型?

【问题讨论】:

  • 如果你的哈希是字符串兼容的......那么字符串应该是要走的路。您正在存储散列密码,那么担心什么?你看到了什么“奇怪”的角色?
  • 如果您真的很担心,您可以将二进制编码为十六进制并将其存储为 varchar。
  • Base64 编码并存储为 varchar。
  • 这是一个 sha 哈希,会导致二进制输出,这可以通过 ASCIIEncoding 作为字符串进行解释,但我不确定这是否是有意的?
  • 不,您绝对应该将其视为 ASCII - 它不是。 Base64 或十六进制是适当的转换。

标签: c# sql sql-server


【解决方案1】:

我的建议是对它进行 base64 编码并将其存储在 CHAR 或 VARCHAR 字段中。该值将相当紧凑(SHA-1 为 28 字节)并且易于操作。

如果不反对稍大的数据大小,十六进制编码将是一个有效的替代方案(SHA-1 为 40 字节)。

【讨论】:

    【解决方案2】:

    我建议使用二进制数据类型来存储散列密码。

    您可以使用 binary 而不是 varbinary,因为散列函数将始终为相同类型的散列(例如 MD5、SHA1 等)返回相同数量的字节。这将减少管理可变长度二进制 (varbinary) 列所需的(少量)开销。

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2012-08-18
      • 2012-08-09
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多