tgoop.com/go_interview_lib/382
Create:
Last Update:
Last Update:
💬 Почему crypto/rand в некоторых кейсах предпочтительнее использовать вместо math/rand для генерации ключей в Go?
Когда мы работаем над проектами, связанными с генерацией ключей, будь то для шифрования или для создания уникальных идентификаторов, важны качество и безопасность этих ключей.
Пакет math/rand
отлично подходит для генерации псевдослучайных чисел. Но у этого метода есть серьезный недостаток: если кто-то узнает, как генерируются числа (начальное значение seed), он сможет предсказать будущие числа.
import "math/rand"
func Key() string {
// rand.Seed(time.Now().UnixNano()) // deprecated
r := rand.New(rand.NewSource(time.Now().UnixNano()))
buf := make([]byte, 16)
for i := range buf {
buf[i] = byte(r.Intn(256))
}
return fmt.Sprintf("%x", buf)
}
Даже если мы инициализируем генератор с чем-то вроде текущего времени, уровень непредсказуемости или энтропии будет довольно низким. Это происходит потому, что вариации времени между запусками незначительны.
С другой стороны,
crypto/rand
предлагает лучшее решение для генерации чисел, которые криптографически безопасны. Эта библиотека разработана для полной непредсказуемости, используя источники случайности, предоставляемые ОС, которые обычно гораздо сложнее предсказать.
import "crypto/rand"
func Key() string {
buf := make([]byte, 16)
_, err := rand.Read(buf)
if err != nil {
panic(err)
}
return fmt.Sprintf("%x", buf)
}
Использование
crypto/rand
особенно необходимо для операций, таких как шифрование, аутентификация или любой другой контекст, где безопасность имеет критическое значение.Опять же, если мы генерируем ключи для целей, не связанных с безопасностью, math/rand вполне подойдет.
BY Библиотека Go для собеса | вопросы с собеседований
Share with your friend now:
tgoop.com/go_interview_lib/382