无法在 powershell 中复制 CryptoJS.enc.Hex.parse(hash)

Failing to replicate CryptoJS.enc.Hex.parse(hash) in powershell

我正在尝试在 powershell 中复制这段代码:

const hmac = CryptoJS.HmacSHA256(CryptoJS.enc.Hex.parse(hash), salt);
seed = hmac.toString(CryptoJS.enc.Hex);

我认为它的作用 - 将 hash 变量解析为二进制表示形式,然后使用它通过 HmacSHA256 创建新的散列。我的 powershell 代码:

    $hmacsha = $hmacsha = New-Object System.Security.Cryptography.HMACSHA256
    $hmacsha.key = [Text.Encoding]::UTF8.GetBytes($salt)
    $signatureRaw = $hmacsha.ComputeHash([Text.Encoding]::UTF8.GetBytes($hash))
    $signature = [System.BitConverter]::ToString($signatureRaw).Replace('-','').ToLower()

据我了解 [Text.Encoding]::UTF8.GetBytes($hash) 应该可以准确地实现,但结果不匹配。代码跨语言使用相同的散列值和盐值。 JS 结果:

original hash: 1c46b79912c6109fe8ccf2dde7e8f931e7a95471e38e22865cd1df719a48d405
resulting hash: 4a9732c4a1f4bd2da1e59f3714c943ef662e664e11ea8364bee870916c42ac5c

Powershell 结果:

original hash: 1c46b79912c6109fe8ccf2dde7e8f931e7a95471e38e22865cd1df719a48d405
resulting hash: 58693c49074149321ec8f440e36f88a3369203c91df8a9c308f78f09ac66733f

在 Powershell 代码中,哈希不能是 UTF8 编码,而是十六进制解码,例如

$hash = [byte[]] -split ($hash -replace '..', '0x$& ')

来自

使用以下代码:

$hmacsha = $hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$salt = "0000000000000000004d6ec16dafe9d8370958664c1dc422f452892264c59526"
$hmacsha.key = [Text.Encoding]::UTF8.GetBytes($salt)
$hash = "1c46b79912c6109fe8ccf2dde7e8f931e7a95471e38e22865cd1df719a48d405"
$hash = [byte[]] -split ($hash -replace '..', '0x$& ')
$signatureRaw = $hmacsha.ComputeHash($hash)
$signature = [System.BitConverter]::ToString($signatureRaw).Replace('-','').ToLower()
Write-Output $signature

结果与 JavaScript 代码相同:

4a9732c4a1f4bd2da1e59f3714c943ef662e664e11ea8364bee870916c42ac5c