HMAC和SHA256 - 如何使用nonce进行验证

时间:2017-06-14 13:00:44

标签: javascript sha256 hmac

我正在尝试与Web API集成。看看他们如何使用SHA256和HMAC来生成他们的签名。然而,他们也使用什么称为“nonce”,我不得不抬头看看。这个api使用我们都知道的秘密和请求的URL来生成“签名”。

那么,我是否使用他们用来生成签名的同一个nonce来进行验证?

我正在查看他们如何在客户端生成这样的签名样本。

        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具有相同的目的。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

我从http://www.freeformatter.com/hmac-generator.html获得的输出是十六进制编码的,您提供的值(ihyCCfTHog7TDQYT4tQM5ISYSjEIaChSeJmIo3UMa+U=)是base64编码的。

如果解码base64编码的消息,将其转换为十六进制并将其与freeformatter(8a1c8209f4c7a20ed30d0613e2d40ce484984a3108682852789988a3750c6be5)的结果进行比较 - 它们都匹配。您可能对转换功能的https://stackoverflow.com/a/12987042/3906760感兴趣。

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

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