Golang:如何仅使用加密/兰特生成随机浮点数

问题描述 投票:0回答:1

我正在使用 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 我怎样才能做到这一点?

go security random
1个回答
0
投票

我实际上也遇到了同样的错误,这个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
}
© www.soinside.com 2019 - 2024. All rights reserved.