带时间窗的 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 是多余的。您已经有一个秘密共享密钥。