在 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()
,並提供一個 種子 值,以初始化隨機數生成器。如果你始終使用相同的種子值,隨機數生成器將生成相同的隨機整數序列。
你可以在 GitHub 找到 random.go
和 randomPass.go
的源碼。你也可以直接在 play.golang.org 上執行它們。
我希望這篇文章對你有所幫助。如有任何問題,請在下方發表評論或在 Twitter 上與我聯繫。
via: https://opensource.com/article/18/5/creating-random-secure-passwords-go
作者:Mihalis Tsoukalos 選題:lkxed 譯者:lkxed 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive