我应该在 SQL Server 上将盐存储为 varchar 还是 varbinary 并以十六进制形式存储?

Posted

技术标签:

【中文标题】我应该在 SQL Server 上将盐存储为 varchar 还是 varbinary 并以十六进制形式存储?【英文标题】:Should I store salt on SQL Server as varchar or varbinary and in hex? 【发布时间】:2015-07-13 15:03:45 【问题描述】:

我正在努力实现哈希。我打算将盐存储在数据库中,特别是 SQL Server。 salt 将至少为 32 个字节。盐应该是十六进制形式还是应该将其转换为字符串、整数或其他形式?另外,我应该使用什么数据类型来存储 salt:varchar、varbinary 还是其他?

为了安全,这真的没关系,因为盐不是秘密。但就性能和可读性而言,它可能会。

非常感谢。

【问题讨论】:

对于那些想知道什么是盐的人,crypto.stackexchange.com/a/2010 【参考方案1】:

任何值得称道的密码算法(请原谅双关语)都将用于二进制数据。假设您使用的盐的长度相同,您应该使用BINARY 列,如果盐的长度可变,请使用VARBINARY

盐应该是随机或伪随机的字节序列。对于您要散列的每个值,它应该不同,但可以明文存储。


这样的代码会给出你需要的值。

-- obviously, don't store a password in code,
-- this is here to enable subsequent calls.
DECLARE @password NVARCHAR(MAX) = N'Whatever';

---

DECLARE @salt BINARY(64) = CRYPT_GEN_RANDOM(64);

-- There is a limit of 4000 bytes for HASHBYTES so in case the password
-- very long, truncate to 3936 bytes. If you can I'd convert the password
-- to binary before passing to SQL server.
DECLARE @passwordBytes VARBINARY(3936);
SELECT
            @passwordBytes = @passwordBytes + 
                CONVERT(BINARY(2), UNICODE(SUBSTRING([A].[B], [V].[number] + 1, 1)))
    FROM
            (SELECT CAST(@password NVARCHAR(1968)) [B]) [A]
        JOIN
            [master].[dbo].[spt_values] [V]
                ON [V].[number] < LEN([A].[B])
    WHERE
            [V].[type] = 'P';

DECLARE @hash BINARY(64) = HASHBYTES('SHA2_512', @passwordBytes + @salt);

【讨论】:

@user3621633,我使NVARCHARVARBINARY 的转换更加稳健,但正如我评论的那样,最好在TSQL 之外执行此操作。

以上是关于我应该在 SQL Server 上将盐存储为 varchar 还是 varbinary 并以十六进制形式存储?的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义格式在 SQL Server 上将 varchar 转换为 datetime

在 SQL Server 中存储图像?

在 Windows 上将 PHP 连接到 SQL Server

如何在 SQL Server 上将 LinkServer 添加到 MySQL

如何在 Mac 上将 ASP.Net Core 连接到 SQL Server Docker 容器

我应该如何使用 sql server 中的存储过程将列名存储在变量中?