Пакет crypto/subtle
Пакет crypto/subtle предоставляет функции для выполнения чувствительных к безопасности операций, которые должны быть устойчивы к атакам по времени. В первый параметр функции ConstantTimeCompare мы передаем первый слайс байт, во второй параметр - второй слайс байт, которые необходимо сравнить. Функция возвращает целое число 1, если слайсы равны, и 0 в противном случае, причем время выполнения не зависит от содержимого сравниваемых данных.
Синтаксис
subtle.ConstantTimeCompare(x, y []byte) int
Пример ⁅n="sect"⁆
Давайте сравним два одинаковых слайса байт с помощью функции ConstantTimeCompare:
package main
import (
"crypto/subtle"
"fmt"
)
func main() {
a := []byte("secret")
b := []byte("secret")
res := subtle.ConstantTimeCompare(a, b)
fmt.Println(res)
}
Результат выполнения кода:
1
Пример ⁅n="sect"⁆
Давайте сравним два разных слайса байт:
package main
import (
"crypto/subtle"
"fmt"
)
func main() {
a := []byte("secret")
b := []byte("password")
res := subtle.ConstantTimeCompare(a, b)
fmt.Println(res)
}
Результат выполнения кода:
0
Пример ⁅n="sect"⁆
Функция ConstantTimeCompare часто используется для безопасного сравнения хешей паролей:
package main
import (
"crypto/sha256"
"crypto/subtle"
"fmt"
)
func main() {
expectedPassword := []byte("mysecretpassword")
userPassword := []byte("mysecretpassword")
expectedHash := sha256.Sum256(expectedPassword)
userHash := sha256.Sum256(userPassword)
if subtle.ConstantTimeCompare(expectedHash[:], userHash[:]) == 1 {
fmt.Println("password match")
} else {
fmt.Println("password mismatch")
}
}
Результат выполнения кода:
"password match"
Смотрите также
-
функцию
sha256.Sum256,
которая вычисляет SHA-256 хеш данных -
функцию
hmac.Equal,
которая безопасно сравнивает HMAC подписи -
функцию
sha512.Sum512,
которая вычисляет SHA-512 хеш данных -
пакет
crypto/subtle,
для криптографически безопасных операций