SQL Server中的SHA256 base 64哈希生成

时间:2017-01-31 09:48:57

标签: sql-server sha256 sha

我需要从SQL服务器的表中生成 SHA256 base 64 哈希,但我无法在list HASHBYTES参数中找到该算法。

有没有办法直接在SQL Server中生成它?

重复的disclamer:

我的问题不是SHA256 in T-sql stored procedure的重复,因为我正在寻找未在页面中列出的SHA256 base 64 版本的算法。

数字示例

我在SQL Server中有这个查询结果

  

开始日期,结束日期,POD,金额,货币

     

2016-01-01,2016-12-31,1234567890,12000,EUR

这给了我以下字符串(使用 concatenate 函数)

  

2016-01-012016-12-31123456789012000EUR

whit this convertion tool我得到以下哈希

  

GMRzFNmm90KLVtO1kwTf7EcSeImq + 96QTHgnWFFmZ0U

我需要发送给客户。

1 个答案:

答案 0 :(得分:11)

首先,您提供的生成器链接以不完全正确的格式输出base64表示。即,它省略了padding sequence。虽然理论上是可选的,但MS SQL Server中必须使用填充(在2012和2016版本上测试)。

考虑到这一点,以下代码为您提供了所需的信息:

declare @s varchar(max), @hb varbinary(128), @h64 varchar(128);

select @s = '2016-01-012016-12-31123456789012000EUR';

set @hb = hashbytes('sha2_256', @s);
set @h64 = cast(N'' as xml).value('xs:base64Binary(sql:variable("@hb"))', 'varchar(128)');

select @hb as [BinaryHash], @h64 as [64Hash];

除了前面提到的填充之外,还有另一个需要注意的地方。确保输入字符串始终为相同类型,即始终为varchar或始终为nvarchar。如果您的某些哈希值将使用ASCII字符串计算,而某些哈希值则来自UTF-16,则结果将完全不同。根据系统中使用的语言,在散列之前始终将纯文本转换为nvarchar可能是有意义的。