我应该在 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,我使NVARCHAR
到VARBINARY
的转换更加稳健,但正如我评论的那样,最好在TSQL 之外执行此操作。以上是关于我应该在 SQL Server 上将盐存储为 varchar 还是 varbinary 并以十六进制形式存储?的主要内容,如果未能解决你的问题,请参考以下文章
使用自定义格式在 SQL Server 上将 varchar 转换为 datetime
在 Windows 上将 PHP 连接到 SQL Server
如何在 SQL Server 上将 LinkServer 添加到 MySQL