2015-01-05 3 views
0

Я делаю некоторые тесты с помощью 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 уровня безопасности. И я хочу сравнить варианты этих уровней, чтобы увидеть, что такое влияние производительности, и как я могу настроить его, чтобы иметь хороший баланс между производительностью и безопасностью.

ответ

1

Здесь не так много ответов, HMAC аутентифицирует сообщение и проверяет целостность, и это похоже на то, что вы хотите. Кроме того, TLS только «более чем достаточно», если вы аутентифицируете клиента. Если это неавторизованный вызов, то HMAC по-прежнему разумно доказывать знание общего секрета.

Обратите внимание, что SecretHash является излишним. У вас уже есть секретный общий ключ.

+0

Вы правы насчет Хэша. Этого не должно быть :). Спасибо за ответ. Просто хотелось быть уверенным, прежде чем я продолжил округлять этот сегмент моей системы. –