Linux中國

在 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: &apos;  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!
[PP8@&apos;Ci

最後一個細節:不要忘記調用 rand.Seed(),並提供一個 種子 seed 值,以初始化隨機數生成器。如果你始終使用相同的種子值,隨機數生成器將生成相同的隨機整數序列。

隨機數生成代碼

你可以在 GitHub 找到 random.gorandomPass.go 的源碼。你也可以直接在 play.golang.org 上執行它們。

我希望這篇文章對你有所幫助。如有任何問題,請在下方發表評論或在 Twitter 上與我聯繫。

via: https://opensource.com/article/18/5/creating-random-secure-passwords-go

作者:Mihalis Tsoukalos 選題:lkxed 譯者:lkxed 校對:wxy

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


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國