tgoop.com/go_interview_lib/590
Create:
Last Update:
Last Update:
💬 Почему для генерации ключей в Go нельзя использовать math/rand
, и как правильно сгенерировать безопасный ключ?
1. Без явного вызова rand.Seed()
генератор math/rand
всегда возвращает одну и ту же последовательность чисел.
2. Если использовать time.Now().UnixNano()
как seed, доступно всего несколько бит энтропии, что делает последовательности легко предсказуемыми.
3. math/rand
не подходит для криптографических задач, так как его алгоритм детерминированный и может быть взломан.crypto/rand Reader
— альтернативный вараинт , а если нам нужен текст, можно вывести его в шестнадцатеричном формате или в формате base64
:
import (
"crypto/rand"
// "encoding/base64"
// "encoding/hex"
"fmt"
)
func Key() string {
buf := make([]byte, 16)
_, err := rand.Read(buf)
if err != nil {
panic(err) // out of randomness, should never happen
}
return fmt.Sprintf("%x", buf)
// or hex.EncodeToString(buf)
// or base64.StdEncoding.EncodeToString(buf)
}
BY Библиотека Go для собеса | вопросы с собеседований
Share with your friend now:
tgoop.com/go_interview_lib/590