我正在尝试与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具有相同的目的。
我错过了什么?
答案 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)。