在 Go 中生成隨機的安全密碼

語言: CN / TW / HK

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 的值為  0MAX 的值為  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!
[[email protected]'Ci

最後一個細節:不要忘記呼叫 rand.Seed() ,並提供一個 種子 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

本文由 LCTT 原創編譯,Linux中國榮譽推出