我正在使用基于 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
是多余的。您已经拥有一个秘密的共享密钥。
- 1 回答
- 0 关注
- 176 浏览
添加回答
举报
0/150
提交
取消