您现在的位置是:亿华云 > 域名

在 Go 中生成随机的安全密码

亿华云2025-10-02 18:47:24【域名】7人已围观

简介你可以使用Go 编程语言​提供的随机数生成器来生成由 ASCII 字符组成的难以猜测的密码。尽管本文中提供的代码很容易阅读,但是你仍需要了解 Go 的基础知识,才能更好地理解它。如果你是对 Go 还不

你可以使用 Go 编程语言​ 提供的中生随机数生成器来生成由 ASCII 字符组成的难以猜测的密码。尽管本文中提供的成随代码很容易阅读,但是安全你仍需要了解 Go 的基础知识,才能更好地理解它。密码如果你是中生对 Go 还不熟悉,请阅读 Go 语言之旅 来了解更多信息,成随然后返回此处。安全

在介绍实用程序和它的密码代码之前,让我们先来看看这个 ASCII 表的中生子集,它可以在 ​​man ascii​​ 命令的成随输出中找到:

30 40 50 60 70 80 90 100 110 120

 ---------------------------------

0:    (  2  <  F  P  Z  d   n   x

1:    )  3  =  G  Q  [  e   o   y

2:    *  4  >  H  R  \  f   p   z

3: !  +  5  ?  I  S  ]  g   q   {

4: "  ,  6  @  J  T  ^  h   r   |

5: #  -  7  A  K  U  _  i   s   }

6: $  .  8  B  L  V  `  j   t   ~

7: %  /  9  C  M  W  a  k   u  DEL

8: &  0  :  D  N  X  b  l   v

9:  1  ;  E  O  Y  c  m   w

在所有 ASCII 字符中,可打印字符的安全十进制值范围为 33 到 126,其他的密码 ASCII 值都不适合用于密码。因此,中生本文介绍的成随实用程序将生成该范围内的 ASCII 字符。

生成随机整数

第一个实用程序名为 ​​random.go​​,安全它生成指定数量的随机整数,这些整数位于给定范围内。​​random.go​​ 最重要的部分是源码库这个函数:

func random(min, max int) int {

return rand.Intn(max-min) + min

}

此函数使用了 ​​rand.Intn()​​ 函数来生成一个属于给定范围的随机整数。请注意,​​rand.Intn()​​ 返回一个属于 ​​[0,n)​​ 的非负随机整数。如果它的参数是一个负数,这个函数将会抛出异常,异常消息是:​​panic: invalid argument to Intn​​。你可以在 ​​math/rand 文档​​ 中找到 ​​math/rand​​ 包的使用说明。

​​random.go​​ 实用程序接受三个命令行参数:生成的整数的最小值、最大值和个数。

编译和执行 ​​random.go​​ 会产生这样的输出:

$ go build random.go

$ ./random

Usage: ./random MIX MAX TOTAL

$ ./random 1 3 10

2 2 1 2 2 1 1 2 2 1

如果你希望在 Go 中生成更安全的随机数,请使用 Go 库中的 ​​crypto/rand​​ 包。

生成随机密码

第二个实用程序 ​​randomPass.go​​ 用于生成随机密码。​​randomPass.go​​ 使用 ​​random()​​ 函数来生成随机整数,它们随后被以下 Go 代码转换为 ASCII 字符:

for {

myRand := random(MIN, MAX)

newChar := string(startChar[0] + byte(myRand))

fmt.Print(newChar)

if i == LENGTH {

break

}

i++

}

​​MIN​​ 的值为 ​​0​​,​​MAX​​ 的值为 ​​94​​,而 ​​startChar​​ 的值为 ​​!​​,它是 ASCII 表中第一个可打印的字符(十进制 ASCII 码为 ​​33​​)。网站模板因此,所有生成的 ASCII 字符都位于 ​​!​​ 和 ​​~​​ 之间,后者的十进制 ASCII 码为 ​​126​​。

因此,生成的每个随机数都大于 ​​MIN​​,小于 ​​MAX​​,并转换为 ASCII 字符。该过程继续进行,直到生成的密码达到指定的长度。

​​randomPass.go​​ 实用程序接受单个(可选)命令行参数,以定义生成密码的长度,默认值为 8,这是一个非常常见的密码长度。执行 ​​randomPass.go​​ 会得到类似下面的输出:

$ go run randomPass.go 1

Z

$ go run randomPass.go 10

#Cw^a#IwkT

$ go run randomPass.go

Using default values!

[PP8@Ci

最后一个细节:不要忘记调用 ​​rand.Seed()​​,并提供一个种子seed值,以初始化随机数生成器。如果你始终使用相同的种子值,随机数生成器将生成相同的随机整数序列。

随机数生成代码

你可以在 ​​GitHub​​ 找到 ​​random.go​​ 和 ​​randomPass.go​​ 的源码。你也可以直接在 ​​play.golang.org​​ 上执行它们。

我希望这篇文章对你有所帮助。亿华云计算

很赞哦!(1)