试图理解 HMAC SHA256

问题描述

对于 API,我需要提供使用 HMAC SHA256 协议散列的安全信息。我想在 Azure sql DB 的存储过程中准备我的所有 API 请求,因此散列需要在 sql 中进行。我不认同这个想法,如果有更好的方法,我可以变得灵活。

目前我有一个问题,我不完全了解创建散列的不同方式如何导致不同的结果。例如;

使用 OpenSSL 的 Linux CMD

~$ echo "message" | openssl dgst -sha256 -hmac "key"

(标准输入)= 62b5378a72e18e8b220382be8a4fce0a341ab06afa6367fe664219713e11bb4d

PowerShell

$message = 'message'

$secret = 'key'

$hmacsha = New-Object System.Security.Cryptography.HMACSHA256

$hmacsha.key = [Text.Encoding]::ASCII.GetBytes($secret)

$signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($message))

$signature = [Convert]::ToBase64String($signature)

echo $signature

bp7ym3X//Ft6uuUn1Y/a2y/kLnIZARl2kXNDBl9Y7Uo=

在线工具

https://www.freeformatter.com/hmac-generator.html#ad-output 6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a

我的标量函数

https://gist.github.com/rmalayter/3130462获取函数

declare @query nvarchar(4000),@secret nvarchar(500);

set @query = 'message'
set @secret = 'key' 

select dbo.fn_HMAC('SHA2_256',cast(@query as varbinary(max)),CAST(@secret as varbinary(max)))

0x93552E8AB930FFCEE9E158A7EA5926A4F36025A1A0ED538763B26AF74147D299

所以这 4 个方法返回 4 个不同的哈希值。我知道我需要 OpenSSL 返回的 Has(第一个示例)。

你能帮我理解为什么这些选项返回不同的哈希值,以及如何在 Linux CMD 中获取 OpenSSL 生成的哈希值吗?

解决方法

明白了! HABO 是对的,它确实与我脚本中的 NVARCHAR 变量有关。一旦用 VARCHAR 替换它就起作用了!!!