Tsql 试图理解HMAC SHA256

Tsql 试图理解HMAC SHA256,tsql,sha256,hmac,Tsql,Sha256,Hmac,对于API,我需要提供使用HMAC SHA256协议散列的安全信息。我想在Azure SQL DB中的存储过程中准备所有API请求,因此哈希需要在SQL中进行。如果有更好的方法可以灵活变通的话,我不会接受这个想法 目前我有一个问题,我不完全理解创建散列的不同方法如何导致不同的结果。比如, 带有OpenSSL的Linux CMD ~$ echo "message" | openssl dgst -sha256 -hmac "key" (标准文本)= 62b

对于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=

在线工具

$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
6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a

我的标量函数

从中获取函数

0x93552E8AB930FFCEE9E158A7EA5926A4F36025A1A0ED538763B26AF74147D299

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


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

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

您是否检查过各种消息的长度(以字节为单位)?在TSQL中,您使用的是存储字节对的
NVarChar
,而不是使用字节的
VarChar
。显示PowersHell和FreeFormatter的结果相同,只是输出格式不同:base-64与十六进制。@HABO;谢谢你的回复。我尝试过使用varchar,我也尝试过使用一个包含UTF-8列的表。但这并不会改变结果哈希。我确实设法从SQL中得到了相同的结果!通过使用这个博客,我获得了与PowerShell和在线工具相同的结果,但我忽略了这些结果实际上是相同的这一事实。不幸的是,这证明了我对OpenSSL版本的担心。