Я делаю некоторые тесты с помощью HMAC, используя механизм тайм-окна, основанный на времени UTC + 0. Сервер имеет специальный публичный API-вызов http://myserver.com/api/servertime/
, который вернет точное время UTC сервера + 0. Таким образом, пользователи API могут синхронизировать свой запрашивающий клиент, чтобы он мог соответствовать временному окну, который мой API позволяет безопасным вызовам. Я построил 30-минутный временной интервал (-15min
- +15min
).HMAC с временным окном
Мой код выглядит следующим образом:
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 уровня безопасности. И я хочу сравнить варианты этих уровней, чтобы увидеть, что такое влияние производительности, и как я могу настроить его, чтобы иметь хороший баланс между производительностью и безопасностью.
Вы правы насчет Хэша. Этого не должно быть :). Спасибо за ответ. Просто хотелось быть уверенным, прежде чем я продолжил округлять этот сегмент моей системы. –