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