带时间窗的 HMAC
HMAC with a time-window
我正在使用基于 UTC+0 同步时间的 time-window 机制对 HMAC 进行一些测试。服务器有一个特殊的 public API 调用 http://myserver.com/api/servertime/
将 return 服务器的确切 UTC+0 时间。通过这种方式,API 用户可以同步他们的请求客户端,以便它能够匹配 window 我的 API 允许安全调用的时间。我建立了一个 30 分钟的时间段 ([=13=] - +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)
}
我正在对将 public 仅在我的 HMAC 哈希中的调用中提供的时间戳与秘密哈希进行哈希处理。我想知道这是否足够万无一失,还是需要更多的工作才能使其完全可靠?调用将是这样的:
POST http://myserver.com/api/users/
Value1 : Data1
Value2 : Data2
Value3 : Data3
Timestamp : 1420497639
最终,当一切正常时,我将通过 SSL/TLS 发送此数据。我知道 SSL 绰绰有余,不需要 HMAC,但我喜欢拥有这 3 层安全性。我想对这些层的变化进行基准测试,看看性能影响是什么,以及如何调整它以在性能和安全性之间取得良好的平衡。
这里没什么好回答的,HMAC 对消息进行身份验证并验证完整性,这似乎就是您想要的。此外,如果您要对客户端进行身份验证,则 TLS 仅 "more than enough"。如果这是未经身份验证的调用,那么 HMAC 仍然可以合理地证明共享秘密的知识。
请注意 SecretHash
是多余的。您已经有一个秘密共享密钥。
我正在使用基于 UTC+0 同步时间的 time-window 机制对 HMAC 进行一些测试。服务器有一个特殊的 public API 调用 http://myserver.com/api/servertime/
将 return 服务器的确切 UTC+0 时间。通过这种方式,API 用户可以同步他们的请求客户端,以便它能够匹配 window 我的 API 允许安全调用的时间。我建立了一个 30 分钟的时间段 ([=13=] - +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)
}
我正在对将 public 仅在我的 HMAC 哈希中的调用中提供的时间戳与秘密哈希进行哈希处理。我想知道这是否足够万无一失,还是需要更多的工作才能使其完全可靠?调用将是这样的:
POST http://myserver.com/api/users/
Value1 : Data1
Value2 : Data2
Value3 : Data3
Timestamp : 1420497639
最终,当一切正常时,我将通过 SSL/TLS 发送此数据。我知道 SSL 绰绰有余,不需要 HMAC,但我喜欢拥有这 3 层安全性。我想对这些层的变化进行基准测试,看看性能影响是什么,以及如何调整它以在性能和安全性之间取得良好的平衡。
这里没什么好回答的,HMAC 对消息进行身份验证并验证完整性,这似乎就是您想要的。此外,如果您要对客户端进行身份验证,则 TLS 仅 "more than enough"。如果这是未经身份验证的调用,那么 HMAC 仍然可以合理地证明共享秘密的知识。
请注意 SecretHash
是多余的。您已经有一个秘密共享密钥。