【问题标题】:SHA256 base 64 hash generation in SQL ServerSQL Server 中的 SHA256 base 64 哈希生成
【发布时间】:2017-06-16 16:41:12
【问题描述】:

我需要从 SQL Server 中的表生成 SHA256 base 64 散列,但在 list HASHBYTES 参数中找不到该算法。

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

重复声明:

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

数值示例

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

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

2016-01-01,2016-12-31,1234567890,12000,欧元

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

2016-01-012016-12-31123456789012000欧元

whit this convertion tool 我得到以下哈希

GMRzFNmm90KLVtO1kwTf7EcSeImq+96QTHgnWFFmZ0U

我需要发送给客户。

【问题讨论】:

  • @Tanner,正如问题中所写,我正在寻找 SHA256 base 64 算法,而不是 SHA256 HEX。因此,它不是重复的。
  • 从普通 SHA256 获取二进制输出并将其编码为 base64 不合适?那有什么区别呢?能否提供更详细说明的链接?
  • @RogerWolf 我添加了一个数字示例。目前我正在编写用户有一个带有 VBA 的 Excel 文件来生成哈希,但我想知道是否可以在 SQL Server 中制作它。
  • 这不是一个单独的算法,它只是获取 SHA256 字节,然后是 encoding them in Base64。

标签: sql-server sha256 sha


【解决方案1】:

首先,您提供的生成器链接以不完全正确的格式输出 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 可能是有意义的。

【讨论】:

  • 两列都为空。我有 MS SQL Server 2012,当我执行这部分代码时,我得到空值,因为 sql hashbytes 函数支持以下哈希算法:'MD2'、'MD4'、'MD5'、'SHA'和'SHA1'。跨度>
  • @oknevermind,您是否在相同的输入数据上测试它?如果没有,请确保您的输入不超过 8000 字节。
  • 对于输入,我使用的是 nvarchar 类型的数据。例如,我使用输入字符串 'ppp_001#Wd!!'
  • @oknevermind,我不认为你使用 2012 版本的服务器。文档明确指出 2012 年支持 SHA2:msdn.microsoft.com/en-us/library/ms174415(v=sql.110).aspx 你检查过print @@version,它说什么?
  • @@Roger,对不起,我的错。你说的对。版本为:Microsoft SQL Server 2008 R2 (SP1)。但是,我的工作计算机上的 SQL Management Studio 版本是 2012。我已阅读您发送的此链接的信息。感谢您的解释。
猜你喜欢
  • 2013-09-11
  • 1970-01-01
  • 2016-08-20
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
相关资源
最近更新 更多