Функция subtle.ConstantTimeCompare

Функция subtle.ConstantTimeCompare выполняет сравнение двух строк (или байтовых срезов) за постоянное время, что делает ее безопасной для использования в криптографических операциях, таких как проверка паролей, хешей или подписей. В отличие от обычного сравнения ==, которое может завершиться досрочно при первом несовпадающем байте, эта функция всегда выполняет одинаковое количество операций независимо от содержимого сравниваемых данных. Первым параметром функция принимает строку или байтовый срез для сравнения, вторым - строку или байтовый срез, с которым производится сравнение.

Синтаксис

gosubtle.ConstantTimeCompare(x, y)

Пример

Давайте сравним две строки одинаковой длины:

gopackage main

import (
  "crypto/subtle"
  "fmt"
)

func main() {
  res := subtle.ConstantTimeCompare([]byte("abcde"), []byte("abcde"))
  fmt.Println(res)
}

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

go1

Обратите внимание, что функция возвращает int: 1 при совпадении и 0 при несовпадении. Это отличается от стандартного булевого возврата, что позволяет использовать результат в битовых операциях.

Пример

Давайте сравним две разные строки одинаковой длины:

gopackage main

import (
  "crypto/subtle"
  "fmt"
)

func main() {
  res := subtle.ConstantTimeCompare([]byte("abcde"), []byte("abxyz"))
  fmt.Println(res)
}

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

go0

Пример

Важно отметить, что функция также работает и со строками, если привести их к байтовым срезам:

gopackage main

import (
  "crypto/subtle"
  "fmt"
)

func main() {
  password := "secret"
  input := "secret"
  res := subtle.ConstantTimeCompare([]byte(password), []byte(input))
  fmt.Println(res)
}

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

go1

Пример

При работе с разными по длине данными функция всегда возвращает 0, но при этом все равно выполняется за постоянное время:

gopackage main

import (
  "crypto/subtle"
  "fmt"
)

func main() {
  res := subtle.ConstantTimeCompare([]byte("abc"), []byte("abcd"))
  fmt.Println(res)
}

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

go0

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

  • пакет crypto/subtle,
    содержащий полезные функции для криптографических операций
  • функцию hmac.Equal,
    которая использует ConstantTimeCompare для безопасного сравнения HMAC-хешей
  • функцию rand.Read,
    которая заполняет срез криптостойкими случайными байтами
  • пакет crypto/hmac,
    реализующий генерацию и проверку HMAC-подписей