问题描述
对于 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 替换它就起作用了!!!