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

Функция subtle.ConstantTimeCompare

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

Синтаксис

subtle.ConstantTimeCompare(x, y)

Пример

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

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

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

1

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

Пример

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

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

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

0

Пример

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

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

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

1

Пример

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

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

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

0

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

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