我正在使用 gosec 来检查我的代码是否存在任何安全缺陷。但它报告了此代码中 math/rand 的使用(使用弱随机数生成器(math/rand 而不是 crypto/rand))pkg:
package main
import (
"fmt"
"math/rand"
)
func main() {
a := rand.Float64()
fmt.Println(a)
}
问题是:crypto/rand 没有获得随机浮点数的选项:https://pkg.go.dev/crypto/rand 我怎样才能做到这一点?
我实际上也遇到了同样的错误,这个Github问题帮助我解决了它。
这应该可行,您必须使用crypto/rand而不是math/rand,您还可能需要处理可能的错误并考虑逻辑中是否需要accuracy返回值。但仍然非常直接:
func generateRandFloat() (float64, error){
// First argument: Reader is a global, shared instance of a cryptographically secure random number generator.
// Second argument: Int returns a uniform random value in [0, max). It panics if max <= 0.
f, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt64))
if err != nil {
return 0, fmt.Errorf("err: unable to generate rand number %w", err)
}
// Float64 returns the float64 value nearest x,
// and an indication of any rounding that occurred.
randFloat, accuracy := f.Float64()
fmt.Printf("In case you need to do something with accuracy returned: %d", accuracy)
return randFloat, nil
}