与C#相比,SQL中的HMAC计算
本文关键字:中的 HMAC 计算 SQL 相比 | 更新日期: 2023-09-27 18:26:15
显然,我需要在SQL(SQL Server 2012)中进行HMAC计算,该计算的值与我在C#中的计算值相同。C#的实现是可行的。它使用标准的.NET类HMACSHA512。
我希望避免使用SQL CLR,而是使用我认为应该根据其他帖子工作的SQL实现。
我有一种感觉,问题在于我将varchars转换为HMAC输入参数的varbinary的方式。我是这样使用的:
DECLARE @hash VARBINARY(64) = (
SELECT dbo.HMAC('SHA2_512', -- Hash alg.
CAST('1234' AS VARBINARY), -- Key
CAST('12345678' AS VARBINARY)) -- Data
);
SELECT CONVERT(VARCHAR(max), @hash, 2) hash_varchar
-- Output: 180F85FDA172A3F1CCEAA25D4D63A05C03F0BF8D664A7AD81E2FE1FB2FF3D4BA754B90A75C58B1D2B8A11C52192CAF307658B4B6A81D06ECB2667F37DA753619
使用C#类计算相同密钥和数据的哈希,得到以下输出:
8DB72756190593E0849AC6CA9B0DB4D3E0A1439AB2D9ECD6D07406020EEA6EE824A89C3DA0633B66AFE5BBA8D4CC5AB59347E8137F5AF6521725307B4DC8BCB5
作为参考,这里是我的确切C#实现。
我是做错了什么,还是HMAC功能的实现?
请参阅RFC2202 HMAC-MD5和HMAC-SHA-1的测试用例。查看SHA1:的测试用例1
test_case = 1
key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
key_len = 20
data = "Hi There"
data_len = 8
digest = 0xb617318655057264e28bc0b6fb378c8ef146be00
C#实现返回正确的值。T-SQL返回一个不正确的值0xF193BA67BF66D733C10099B62D06F19AD98B1022
。QED。T-SQL代码是伪造的。