Пакет hkdf
Обзор
Пакет hkdf реализует функцию формирования ключа HKDF (HMAC-based Extract-and-Expand Key Derivation Function), определенную в RFC 5869.
HKDF — это криптографическая функция формирования ключа (KDF), предназначенная для расширения ограниченного исходного ключевого материала в один или несколько криптографически стойких секретных ключей.
Пример (Использование)
Пример использования, расширяющий один мастер-секрет в три других криптографически безопасных ключа.
Код:
// Underlying hash function for HMAC.
hash := sha256.New
keyLen := hash().Size() / 2
// Cryptographically secure master secret.
secret := []byte{0x00, 0x01, 0x02, 0x03} // i.e. NOT this.
// Non-secret salt, optional (can be nil).
// Recommended: hash-length random value.
salt := make([]byte, hash().Size())
if _, err := rand.Read(salt); err != nil {
panic(err)
}
// Non-secret context info, optional (can be nil).
info := "hkdf example"
// Generate three 128-bit derived keys.
var keys [][]byte
for i := range 3 {
key, err := hkdf.Key(hash, secret, salt, info+strconv.Itoa(i), keyLen)
if err != nil {
panic(err)
}
keys = append(keys, key)
}
for i := range keys {
fmt.Printf("Key #%d: %v\n", i+1, !bytes.Equal(keys[i], make([]byte, 16)))
}
Вывод:
Key #1: true Key #2: true Key #3: true
Указатель
Примеры
Файлы пакета
hkdf.go
func Expand 1.24
func Expand[H hash.Hash](h func() H, pseudorandomKey []byte, info string, keyLength int) ([]byte, error)
Expand формирует ключ из заданной хеш-функции, ключа и необязательной контекстной информации info, возвращая []byte длиной keyLength, который можно использовать в качестве криптографического ключа. Шаг извлечения (extraction) пропускается.
Ключ должен быть предварительно сгенерирован с помощью Extract либо представлять собой равномерно случайный или псевдослучайный криптографически стойкий ключ. См. RFC 5869, раздел 3.3. В большинстве типичных сценариев предпочтительнее использовать Key.
func Extract 1.24
func Extract[H hash.Hash](h func() H, secret, salt []byte) ([]byte, error)
Extract генерирует псевдослучайный ключ для использования с Expand из входного секрета и необязательной независимой соли.
Используйте эту функцию только в том случае, если вам необходимо повторно использовать извлеченный ключ для нескольких вызовов Expand с различными значениями контекста. В большинстве типичных сценариев, включая генерацию нескольких ключей, предпочтительнее использовать Key.
func Key 1.24
func Key[Hash hash.Hash](h func() Hash, secret, salt []byte, info string, keyLength int) ([]byte, error)
Key формирует ключ из заданной хеш-функции, секрета, соли и контекстной информации info, возвращая []byte длиной keyLength, который можно использовать в качестве криптографического ключа. Параметры salt и info могут быть nil.
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/crypto/hkdf/