РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1257 of 1593 menu

Функция hmac.Equal

Функция hmac.Equal предназначена для безопасного сравнения двух HMAC-подписей (сообщений аутентификации кода на основе хеша). В первый параметр передается ожидаемая подпись, во второй - вычисленная подпись. Главная особенность функции заключается в том, что она выполняет сравнение за постоянное время, что исключает возможность временных атак (timing attacks), когда злоумышленник может определить правильность подписи по времени ответа сервера.

Функция принимает два аргумента типа []byte: первый - ожидаемая подпись (expected MAC), второй - вычисленная подпись (actual MAC). Возвращает bool - true, если подписи равны, и false в противном случае.

Синтаксис

hmac.Equal(expected, actual)

Пример

Давайте создадим HMAC-подпись для сообщения с использованием SHA-256 и сравним ее с эталонной подписью:

package main import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "fmt" ) func main() { key := []byte("secret-key") message := []byte("important data") // Создаем HMAC подпись h := hmac.New(sha256.New, key) h.Write(message) signature := h.Sum(nil) // Ожидаемая подпись (для примера используем ту же) expected := signature // Проверяем подписи res := hmac.Equal(expected, signature) fmt.Println(res) }

Результат выполнения кода:

true

Пример

Теперь сравним корректную подпись с поддельной. Создадим две HMAC-подписи с разными ключами и проверим их равенство:

package main import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "fmt" ) func main() { key1 := []byte("correct-key") key2 := []byte("wrong-key") message := []byte("secret data") // Создаем HMAC подпись с правильным ключом h1 := hmac.New(sha256.New, key1) h1.Write(message) correctSignature := h1.Sum(nil) // Создаем HMAC подпись с неправильным ключом h2 := hmac.New(sha256.New, key2) h2.Write(message) wrongSignature := h2.Sum(nil) // Сравниваем подписи res := hmac.Equal(correctSignature, wrongSignature) fmt.Println(res) }

Результат выполнения кода:

false

Пример

Рассмотрим практический сценарий - проверка подписи сообщения при получении данных из внешнего источника. Функция hmac.Equal используется для безопасной верификации целостности и подлинности сообщения:

package main import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "fmt" ) func main() { key := []byte("shared-secret-key") message := []byte("transaction data: transfer $100 to user123") receivedSignature, _ := hex.DecodeString("a1b2c3d4e5f6...") // Вычисляем подпись для полученного сообщения h := hmac.New(sha256.New, key) h.Write(message) computedSignature := h.Sum(nil) // Безопасно сравниваем подписи if hmac.Equal(receivedSignature, computedSignature) { fmt.Println("Signature valid - processing transaction") } else { fmt.Println("Invalid signature - rejecting request") } }

Результат выполнения кода:

"Invalid signature - rejecting request"

Смотрите также

  • функцию hmac.New,
    которая создает новый HMAC-хеш для подписи сообщений
  • функцию subtle.ConstantTimeCompare,
    которая обеспечивает сравнение байтовых массивов за постоянное время
  • функцию sha256.New,
    которая создает SHA-256 хеш для использования в HMAC
  • функцию hash.Hash,
    которая является интерфейсом для хеш-функций в пакете crypto
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить