Функция 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-подписей