首页 > 解决方案 > 如何让 Golang 种子初始化更强大

问题描述

我会看到人们使用这种方法为 Go 随机播种 init 以使其随机化!

func init() {
    rand.Seed(time.Now().UTC().UnixNano())
}

我 100% 确定这种方法不安全,猜测time.Now().UTC().UnixNano()是 1000X> 容易然后找到真正生成的随机密码

有没有人有想法,我认为也调用 windows api 来生成随机种子是个好主意?

标签: securitygorandom

解决方案


如果安全性很重要,那么您应该首先“放弃”math/rand并使用crypto/rand

如果安全性“不”重要,那么播种time.Now().UnixNano()就很好了。(请注意,无需调用Time.UTC(),因为Time.UnixNano()返回指定为 UTC 的 Unix 时间。)

注意,24 小时有2592000000000000纳秒,所以即使知道一天,理论上也有 2.592*10 15种不同的种子组合,对于非安全场景来说已经足够完美了。

rand.Seed()是播种包的全局Randmath/rand您不必(您不能)为crypto/rand包裹播种。

查看可能的重复项:Generate random string without time?

查看相关问题:

在 Go 中生成一个随机的、固定长度的字节数组

如何在golang中获取随机数样本?


推荐阅读