HMAC 和 SHA256 - 如何使用随机数进行验证

HMAC and SHA256 - how to validate using nonce

我正在尝试与 Web 集成 API。查看他们如何使用 SHA256 和 HMAC 生成签名。然而,他们也使用所谓的 "nonce",我不得不查找它。 api 使用我们都知道的秘密生成 "signature",并结合请求的 url。

那么,我是否使用他们用来在我这边生成签名的相同随机数来进行验证?

我正在查看他们如何在客户端生成签名的示例。

        var message = "https://my.server.com/new-callback?reqID=test&nonce=8cf95201-4d3c-4397-9117-d7ee6ad89d93";
        var secret = "g394g732vhsdfiv34";
        var hash = CryptoJS.HmacSHA256(message, secret);
        var signature = hash.toString(CryptoJS.enc.Base64); 

result of signature...


// ihyCCfTHog7TDQYT4tQM5ISYSjEIaChSeJmIo3UMa+U=

但是,我使用此工具没有得到相同的结果
http://www.freeformatter.com/hmac-generator.html

因此,为了在我这边(在 api 内)验证这一点,我需要使用相同的输入来计算签名,然后简单地比较结果字符串,对吗?

这个 "nonce" 组件有什么作用?根据我的阅读,它或多或少与 GUID 具有相同的目的。

我错过了什么?

我从 http://www.freeformatter.com/hmac-generator.html is hex encoded and the value you provided (ihyCCfTHog7TDQYT4tQM5ISYSjEIaChSeJmIo3UMa+U=) is base64 编码得到的输出。

如果您解码 base64 编码的消息,将其转换为十六进制并将其与 freeformatter 的结果(即 8a1c8209f4c7a20ed30d0613e2d40ce484984a3108682852789988a3750c6be5)进行比较 - 它们都匹配。您可能对 转换函数感兴趣。

是的:您计算两侧的 HMAC 并比较结果。如果它匹配(没有其他人知道这个秘密)你就安全了。

随机数是一个随机值,以防止重放攻击(参见 https://en.wikipedia.org/wiki/Cryptographic_nonce)。