【问题标题】:HMAC calculation in SQL compared to C#SQL 中的 HMAC 计算与 C# 的比较
【发布时间】:2023-03-31 15:11:02
【问题描述】:

显然,我需要在 SQL (SQL Server 2012) 中进行 HMAC 计算,它给出的值与我在 C# 中的计算相同。 C# 实现有效。它使用标准的.NET 类HMACSHA512

我想避免使用 SQL CLR,而是使用我认为应该根据其他帖子工作的this SQL implementation

我感觉问题在于我将 varchars 转换为 HMAC 输入参数的 varbinaries 的方式。我是这样使用它的:

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# implementation

是我做错了什么,还是HMAC函数的实现?

【问题讨论】:

    标签: c# sql sql-server-2012 cryptography hmac


    【解决方案1】:

    请参阅RFC2202 Test Cases for HMAC-MD5 and 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 代码是伪造的。

    【讨论】:

    • 我知道这一点。问题是我是否错误地使用了 HMAC sql 函数(在 varchars 的转换中,也许?),或者该函数是否如您所建议的那样是伪造的。抱歉,如果不清楚。
    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 2011-11-14
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    相关资源
    最近更新 更多