我应该在 SQL 服务器上以 varchar 或 varbinary 形式以十六进制形式存储 salt 吗?

Should I store salt on SQL Server as varchar or varbinary and in hex?

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

出于安全考虑,这真的无关紧要,因为盐不是秘密。但就性能和可读性而言,它可能。

非常感谢。

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

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


像这样的代码将提供您需要的值。

-- 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);