生成好的密码,第一部分
Dave 在 1Password 的帮助下开始了一种生成安全密码的新方法。
不久前,我分享了一个脚本概念,它可以让你输入一个拟议的帐户密码,并评估它是否非常好(嗯,也许“安全”是更好的词来描述这组测试,以确保拟议的密码包含大写字母、小写字母、数字和标点符号,使其更难猜测)。
但从那时起,我真的在尝试个人超越任何形式的助记密码,转向那些看起来更像乱码的密码。 你知道我的意思——像 fRz3li,4qDP? 这样的密码,结果基本上是随机的,因此不可能使用任何形式的字典攻击来破解。
1Password 这个出色的密码管理器在这方面帮助了我。 你可以在这里了解更多信息,但我使用的关键功能是结合了安全存储我数百个网站的密码,以及拥有一个简单直接的密码生成器功能(图 1)。

图 1. 1Password 密码生成系统
但是,如果我在命令行上工作,为什么要弹出到程序中来获得一个好的密码呢? 相反,一个脚本可以做同样的事情,特别是如果我再次利用有用的 $RANDOM
快捷方式来生成随机数。
完成这项任务的最简单方法是采用一种通用的方法,从一组特定的可能性中生成一个随机元素。 因此,可以像这样生成一个随机大写字母
uppers="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
letter=${uppers:$(( $RANDOM % 26 )):1}
这里使用的基本表示法约定是 Bash shell 变量切片语法的超级便利的语法:
${variable:startpoint:charcount}
例如,要仅获取变量的第一个字符,您可以简单地将其引用为
${variable:1:1}
这很容易。 但是,我没有使用固定的引用编号,而是使用 $(( $RANDOM % 26 ))
作为一种生成 0-25 之间的值的方法,每次都不同。
添加包含您寻求的所有主要字符类的字符串,您就获得了一个良好的开端
lowers="abcdefghijklmnopqrstuvwxyz"
digits="0123456789"
punct="()./?;:[{]}|=+-_*&^%$#@!~" # skip quotes
为了更加灵活,还有另一种表示法 ${#variable}
,它返回变量中的字符数,因此以下内容显示该特定字符串中有 24 个字符
$ echo ${#punct}
24
为了获得最大的灵活性,每个引用都可以包含它,允许我随意添加或删除特定的标点符号
${punct:$(( $RANDOM % ${#punct} )):1}
它开始看起来有点像我的猫跑过键盘,但这就是我在这里添加所有空格的原因。 许多脚本编写者倾向于避开所有这些空格并使用更短的变量名,但在我看来,像这样的东西肯定更难阅读和理解
${p:$(($RANDOM % ${#p})):1}
事实上,它让我想起了一种叫做 APL 的旧编程语言,人们普遍认为,重写代码比理解程序中其他人所做的事情更容易。 哎呀。
这解决了在特定字符集中生成随机字符的挑战,我将把脚本的下一部分推迟到我的下一篇专栏文章中,届时我将展示如何构建这些随机字符的序列以创建所需长度和复杂度的字符串。