HMAC带有时间窗口

时间:2015-01-05 22:53:18

标签: security rest go hmac

我正在使用基于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 : Data1
Value2 : Data2
Value3 : Data3
Timestamp : 1420497639

最后,当一切正常时,我将通过SSL / TLS发送此数据。我知道SSL已经足够了,不需要HMAC,但我喜欢这3层安全性。我想对这些层的变体进行基准测试,以了解性能影响是什么以及如何调整它以在性能和安全性之间取得良好的平衡。

1 个答案:

答案 0 :(得分:1)

这里没有太多要回答的问题,HMAC对消息进行身份验证并验证完整性,这似乎就是您想要的。此外,如果您正在验证客户端,TLS只是“绰绰有余”。如果这是一个未经认证的电话,那么HMAC仍然可以证明共享秘密的知识。

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