如何在Go中创建随机的安全密码
Go的随机数生成器是生成难以猜测的密码的好方法。
您可以使用Go编程语言提供的随机数生成器生成由ASCII字符组成的安全密码。虽然本文中提供的代码易于阅读,但最好是了解Go的基础知识。
在我们进入实例代码之前,请查看在man ascii
命令输出中找到的ASCII
表的这个子集:
30 40 50 60 70 80 90 100 110 120
---------------------------------
0:(2 <F P Z d n x
1:)3 = GQ [eoy
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; EOY cmw
可打印的ASCII字符的十进制值范围为33到126; 没有其他ASCII值适合包含在密码中。因此,本文中提供的实用程序将生成该范围内的ASCII字符。
创建随机整数
第一个实用程序已命名random.go
,它生成指定数量的随机整数,这些整数位于给定范围内。最重要的部分 random.go
是这个功能:
func random ( min , max int ) int {
return rand 。Intn (最大-最小) +最小
}
此函数使用 rand.Intn()
Go函数生成给定范围的随机整数。注意,rand.Intn()
返回非负随机数[0,n); 如果它的参数是负数,该函数将会发生混乱。混乱信息将是panic: invalid argument to Intn
。
该random.go
实用程序接受三个命令行参数:生成的整数的最小值,最大值以及将生成的整数。
编译和执行random.go
将创建输出:
$ go build random.go
$ ./random
用法:./随机MIX MAX TOTAL
$ ./random 1 3 10
2 2 1 2 2 1 1 2 2 1
如果您希望在Go
中生成更安全的随机数,请使用crypto/randGo
扩展包。
创建随机密码
第二个实例 randomPass.go
将生成随机密码。randomPass.go
使用 random()
函数生成随机数,使用以下Go
代码转换为ASCII
字符:
for {
myRand := random ( MIN , MAX )
newChar := string ( startChar [ 0 ] + byte ( myRand ))
fmt 。打印( newChar )
如果 我 = = 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()
使用种子值调用以初始化随机数生成器。如果始终使用相同的种子值,则随机数生成器将创建相同的随机整数序列。
你可以在 GitHub上找到 random.go
和randomPass.go
代码。
译文地址: https://opensource.com/article/18/5/creating-random-secure-passwords-go