Redian新闻
>
在 Go 中生成随机的安全密码 | Linux 中国

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

科技
 
导读:Go 的随机数生成器是生成难以猜测的密码的好方法。                                 
本文字数:3098,阅读时长大约:3分钟

LCTT 译者 :六开箱
🌟🌟🌟🌟
翻译: 60.0 篇
|
贡献: 67 天
2022-03-16
2022-05-21
https://linux.cn/lctt/lkxed

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

在介绍实用程序和它的代码之前,让我们先来看看这个 ASCII 表的子集,它可以在 man ascii 命令的输出中找到:

  1. 30 40 50 60 70 80 90 100 110 120
  2.  ---------------------------------
  3. 0:    (  2  <  F  P  Z  d   n   x
  4. 1:    )  3  =  G  Q  [  e   o   y
  5. 2:    *  4  >  H  R  \  f   p   z
  6. 3: !  +  5  ?  I  S  ]  g   q   {
  7. 4: "  ,  6  @  J  T  ^  h   r   |
  8. 5: #  -  7  A  K  U  _  i   s   }
  9. 6: $  .  8  B  L  V  `  j   t   ~
  10. 7: %  /  9  C  M  W  a  k   u  DEL
  11. 8: &  0  :  D  N  X  b  l   v
  12. 9: '  1  ;  E  O  Y  c  m   w

在所有 ASCII 字符中,可打印字符的十进制值范围为 33 到 126,其他的 ASCII 值都不适合用于密码。因此,本文介绍的实用程序将生成该范围内的 ASCII 字符。

生成随机整数

第一个实用程序名为 random.go,它生成指定数量的随机整数,这些整数位于给定范围内。random.go 最重要的部分是这个函数:

  1. func random(min, max int) int {
  2. return rand.Intn(max-min) + min
  3. }

此函数使用了 rand.Intn() 函数来生成一个属于给定范围的随机整数。请注意,rand.Intn() 返回一个属于 [0,n) 的非负随机整数。如果它的参数是一个负数,这个函数将会抛出异常,异常消息是:panic: invalid argument to Intn。你可以在 math/rand 文档🔗 golang.org 中找到 math/rand 包的使用说明。

random.go 实用程序接受三个命令行参数:生成的整数的最小值、最大值和个数。

编译和执行 random.go 会产生这样的输出:

  1. $ go build random.go
  2. $ ./random
  3. Usage: ./random MIX MAX TOTAL
  4. $ ./random 1 3 10
  5. 2 2 1 2 2 1 1 2 2 1

如果你希望在 Go 中生成更安全的随机数,请使用 Go 库中的 crypto/rand 包。

生成随机密码

第二个实用程序 randomPass.go 用于生成随机密码。randomPass.go 使用 random() 函数来生成随机整数,它们随后被以下 Go 代码转换为 ASCII 字符:

  1. for {
  2. myRand := random(MIN, MAX)
  3. newChar := string(startChar[0] + byte(myRand))
  4. fmt.Print(newChar)
  5. if i == LENGTH {
  6. break
  7. }
  8. i++
  9. }

MIN 的值为 0MAX 的值为 94,而 startChar 的值为 !,它是 ASCII 表中第一个可打印的字符(十进制 ASCII 码为 33)。因此,所有生成的 ASCII 字符都位于 ! 和 ~ 之间,后者的十进制 ASCII 码为 126

因此,生成的每个随机数都大于 MIN,小于 MAX,并转换为 ASCII 字符。该过程继续进行,直到生成的密码达到指定的长度。

randomPass.go 实用程序接受单个(可选)命令行参数,以定义生成密码的长度,默认值为 8,这是一个非常常见的密码长度。执行 randomPass.go 会得到类似下面的输出:

  1. $ go run randomPass.go 1
  2. Z
  3. $ go run randomPass.go 10
  4. #Cw^a#IwkT
  5. $ go run randomPass.go
  6. Using default values!
  7. [PP8@'Ci

最后一个细节:不要忘记调用 rand.Seed(),并提供一个种子(seed)值,以初始化随机数生成器。如果你始终使用相同的种子值,随机数生成器将生成相同的随机整数序列。

随机数生成代码

你可以在 GitHub🔗 github.com 找到 random.go 和 randomPass.go 的源码。你也可以直接在 play.golang.org🔗 play.golang.org 上执行它们。

我希望这篇文章对你有所帮助。如有任何问题,请在下方发表评论或在 Twitter🔗 twitter.com 上与我联系。


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

作者:Mihalis Tsoukalos 选题:lkxed 译者:lkxed 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
在 Ubuntu Linux 如何安装 H.264 解码器 | Linux 中国Linux 内核 5.18 版本正式发布,新增显卡驱动以及硬件支持 | Linux 中国忆秦娥: 飞扬柳絮飘如雪你的 Linux 启动时有几只小企鹅? | Linux 中国使用 apt 进行 Linux 包管理 | Linux 中国Collision:用于验证 ISO 和其他文件的 Linux 应用 | Linux 中国Archinstall 新的菜单系统让安装 Arch Linux 更容易了 | Linux 中国两个女人—转载用 Gwenview 在 Linux 上裁剪和调整照片大小 | Linux 中国如何在 Fedora Linux 中安装多媒体编码器 | Linux 中国System76 与惠普合作为开发者提供功能强大的 Linux 笔记本电脑 | Linux 中国好消息!Docker Desktop 现已支持 Linux | Linux 中国上一个说“丼”不读jǐng的人,已经被我骂哭了使用 watch 和 tail 命令监视 Linux 上的活动 | Linux 中国Linux 中国开通播客频道:“开源朗读者”和“硬核观察” | Linux 中国我如何在 Linux 上扫描家庭照片 | Linux 中国在虚拟机中运行 Linux 的十大优点 | Linux 中国Fedora Linux 36 发布 | Linux 中国Fudgie?令人惊叹的 Budgie 桌面即将登陆 Fedora Linux | Linux 中国在 Linux 上使用 sudo 命令的 5 个理由 | Linux 中国原油涨跌的故事英伟达在提升 Linux 上的 GPU 使用体验上迈出了一大步 | Linux 中国如何在 Linux 桌面中启用 “激活 Linux” 水印通知 | Linux 中国推荐意大利黑帮剧集Gomorrah实测 Linux Mint 升级工具 | Linux 中国CentOS 的继承者 AlmaLinux 9 发布 | Linux 中国Plex 桌面播放器现已支持 Linux | Linux 中国分享 8 篇使用 Linux 命令行的技巧 | Linux 中国Linux Lite 6.0 发布:弃用 Firefox,默认浏览器使用 Chrome | Linux 中国如何在 Linux 和 Windows 电脑之间共享文件 | Linux 中国秋收暴动和毛泽东的“三湾子弟”微软还有另一个 Linux 发行版,而且是基于 Debian 的 | Linux 中国使用 dnf 进行 Linux 包管理 | Linux 中国最适合程序员的 10 款 Linux 发行版 | Linux 中国HydraPaper:一个支持多显示器的 Linux 壁纸管理器 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。