| 会员登录 立即注册

打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
3AAA 发表于 2022-5-23 07:35:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
楼主
3AAA
2022-5-23 07:35:29 5436 0 看楼主

Go 的随机数生成器是生成难以猜测的密码的好方法。



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

在介绍实用程序和它的代码之前,让我们先来看看这个 ASCII 表的子集,它可以在 man ascii命令的输出中找到:
30 40 50 60 70 80 90 100 110 120 ---------------------------------0:    (  2    Z  d   n   x1:    )  3  =  G  Q  [  e   o   y2:    *  4  >  H  R  \  f   p   z3: !  +  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  DEL8: &  0  :  D  N  X  b  l   v9: '  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$ ./randomUsage: ./random MIX MAX TOTAL$ ./random 1 3 102 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 1Z$ go run randomPass.go 10#Cw^a#IwkT$ go run randomPass.goUsing default values![PP8@'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中国荣誉推出
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表

3AAA 当前离线
白银会员

查看:5436 | 回复:0

关于我们  |   侵权投诉受理  |   联系我们  |   Archiver  |  
免责声明:邳州信息网所有言论只代表发表者个人观点,与本站无关
Copyright © 2009-2025 pzxxw.com 版权所有:邳州金银杏文化传媒有限公司  

苏公网安备 32038202000401号

快速回复 返回顶部 返回列表