为了账号安全,请及时绑定邮箱和手机立即绑定

带有时间窗口的 HMAC

带有时间窗口的 HMAC

Go
德玛西亚99 2021-09-10 17:11:16
我正在使用基于 UTC+0 同步时间的时间窗口机制对 HMAC 进行一些测试。服务器有一个特殊的公共 API 调用http://myserver.com/api/servertime/,它将返回服务器的确切 UTC+0 时间。通过这种方式,API 用户可以同步他们的请求客户端,以便它能够匹配我的 API 允许安全调用的时间窗口。我建立了一个 30 分钟的时间段 ( -15min- +15min)。我的代码如下所示:func GenerateHmac512(message []byte, key []byte) []byte {    h := hmac.New(sha512.New, key)    h.Write(message)    return []byte(base64.StdEncoding.EncodeToString(h.Sum(nil)))}func ValidateHmac512(message, messageMAC, key []byte) bool {    var err error    decryptedMessageMAC, err := base64.StdEncoding.DecodeString(string(messageMAC))    if err != nil {        log.Fatalln(err.Error())        return false    }    mac := hmac.New(sha512.New, key)    mac.Write(message)    expectedMAC := mac.Sum(nil)    return hmac.Equal(decryptedMessageMAC, expectedMAC)}func main() {    timestamp := time.Now().Unix()    key := []byte("afad9411468602782fb62d904f623d87")    message := []byte(fmt.Sprintf("SecretHash,Value1,Value2,Value3,TimeStamp:%d", time.Now().Unix()))    hmacHash := GenerateHmac512(message, key)    hmacValid := ValidateHmac512(message, hmacHash, key)    log.Println(timestamp)    log.Println(string(hmacHash))    log.Println(hmacValid)    requestValid := false    if timestamp > time.Now().Unix()-(60*15) && timestamp < time.Now().Unix()+(60+15) {        requestValid = true    }    log.Println(requestValid)}我正在散列将在我的 HMAC 散列中的调用中公开提供的时间戳,并结合秘密散列。我想知道这是否足够万无一失,还是需要更多的工作才能使其完全稳固?调用将是这样的:POST http://myserver.com/api/users/Value1 : Data1Value2 : Data2Value3 : Data3Timestamp : 1420497639最终,当一切顺利时,我将通过 SSL/TLS 发送这些数据。我知道 SSL 已经绰绰有余,不需要 HMAC,但我喜欢拥有这 3 层安全性。我想对这些层的变化进行基准测试,以了解性能影响是什么,以及我如何调整它以在性能和安全性之间取得良好的平衡。
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

这里没什么好回答的,HMAC 验证消息并验证完整性,这似乎就是您想要的。此外,如果您对客户端进行身份验证,TLS 只是“绰绰有余”。如果这是一个未经身份验证的调用,那么 HMAC 仍然可以合理地证明共享秘密的知识。

请注意,这SecretHash是多余的。您已经拥有一个秘密的共享密钥。


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信