生成优秀密码,第二部分
发表于 2018 年 5 月 29 日
密码。它们是计算机用户的祸根,也是必要的罪恶,但它们也伴随着风险和挑战。 没有一个选择是完美的。 如果完全依靠你的记忆,你最终会一次又一次地使用同一个密码。 使用像 1Password 这样的密码管理器,你又依赖于它的数据库安全性和可移植性。 双重验证? 嗯,我可以借用你的手机一分钟吗?
尽管如此,拥有复杂且随机的密码肯定比使用你多年来一直使用的最喜欢的短语或变体要安全得多。 你知道我的意思,承认吧; 你一直都在使用相同的 PIN 和密码,对吗?
上次,我构建了一个脚本,可以从一组字符集中生成一个随机字符。 例如,可以像这样生成一个随机大写字母
uppercase="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
${uppercase:$(( $RANDOM % ${#uppercase} )):1}
添加小写字母和一组受约束的标点符号,以及你想要的每种字符的数量规则,你就可以生成一些非常复杂的密码。 首先,让我们只关注 *n* 个大写字母的随机序列。
这很容易做到
while [ ${#password} -lt $length ] ; do
letter=${uppers:$(( $RANDOM % ${#uppers} )):1}
password="${password}$letter"
done
请记住,${#var}
符号会生成该变量当前值的长度,因此这是一种简单的方法来构建 $password
变量,直到它等于 $length
中指定的目标长度。
这是一个快速测试运行或两个
$ sh makepw.sh
password generated = HDBYPMVETY
password generated = EQKIQRCCZT
password generated = DNCJMMXNHM
看起来不错! 现在更大的挑战是从一组选项中随机选择。 有几种方法可以做到这一点,但让我们使用 case
语句,像这样
while [ ${#password} -lt $length ] ; do
case $(( $RANDOM % 4 )) in
0 ) letter=${uppers:$(( $RANDOM % ${#uppers} )):1} ;;
1 ) letter=${lowers:$(( $RANDOM % ${#lowers} )):1} ;;
2 ) letter=${punct:$(( $RANDOM % ${#punct} )):1} ;;
3 ) letter=${digits:$(( $RANDOM % ${#digits} )):1} ;;
esac
password="${password}$letter"
done
由于您基本上对大写、小写、数字和标点符号的权重相同,因此最终密码标点符号过多也就不足为奇了
$ sh makepw.sh
password generated = 8t&4n=&b(B
password generated = 5=B]9?CEqQ
password generated = |1O|*;%&A;
这些都是很棒的密码,无法通过算法猜测(而且,是的,也很难记住,但这是这种密码算法不可避免的副作用)。
但假设你更喜欢字母和数字,而不是标点符号,因为它更容易输入。 这可以通过简单地扩展随机数选择并将多个值分配给你希望更频繁出现的那些选项来完成,如下所示
while [ ${#password} -lt $length ] ; do
case $(( $RANDOM % 7 )) in
0|1 ) letter=${uppers:$(( $RANDOM % ${#uppers})):1} ;;
2|3 ) letter=${lowers:$(( $RANDOM % ${#lowers})):1} ;;
4|5 ) letter=${punct:$(( $RANDOM % ${#punct} )):1} ;;
6 ) letter=${digits:$(( $RANDOM % ${#digits} )):1} ;;
esac
password="${password}$letter"
done
这样效果更好,结果也不太像猫在键盘上乱跑
$ sh makepw.sh
password generated = /rt?7D8QxR
password generated = us&*gpyB*-
password generated = rB}?2:)eJM
password generated = PC34jOD_}2
下次,也许我会改变一下,让用户指定所需的长度和将标点符号添加到生成的密码中的概率。 在那之前,保持安全!