我应该在 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);
我正在努力实现哈希。我打算将盐存储在数据库中,特别是 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);