我当前正在生成一个密码,它是日期的哈希值。我想通过添加一些大写、小写、数字和特殊字符来提高生成的密码的安全性,所有字符的最小长度都为 10 个字符。
我目前拥有的如下。如您所见,它将输出分配给我的 PASSWORD 变量。
PASSWORD=$(date +%s | sha256sum | base64 | head -c 15)
我不确定是否可以内联执行此操作,或者是否需要在 bash 脚本中创建一个函数来适应?这可能吗?
提前非常感谢。
与
tr
和 head
:
password=$(tr -dc 'A-Za-z0-9!?%=' < /dev/urandom | head -c 10)
echo "$password"
输出(示例):
k?lmyif6aE
tr
通过 stdin 从 Linux 的特殊随机设备 /dev/urandom 读取字节,并删除除 A
到 Z
、a
到 z
、0
到 9
之外的所有字节/字符和!?%=
。 tr
通过标准输出将其输出发送到head
的标准输入。 head
在 10 个字节后剪切输出。
对 @Cyrus 的答案进行一些扩展,这是我在处理很多上下文中的大量密码后确定的替代版本:
# Generate a url safe password.
password() {
local length=${1:-"10"}
cat /dev/urandom | tr -dc A-Za-z0-9~_- | head -c $length && echo
}
这仅使用不需要进行 url 编码且易于选择和键入的字符,并且仍然具有大约 60 位的熵,这对于大多数用途来说已经足够了(我实际上使用默认长度 20,其中有 120一些熵,但我无法诚实地论证这对于安全来说是必要的)。
我还有以下内容:
# Generate a url safe password that:
# - begins with a letter, and has at least
# - one uppercase letter,
# - one lowercase letter,
# - one digit, and
# - one special character.
stupid_password() {
while :
do
local pass=$(password "$1")
[[ $pass != *[~_-]* ]] && continue
[[ $pass != [A-Za-z]* ]] && continue
[[ $pass != *[A-Z]* ]] && continue
[[ $pass != *[a-z]* ]] && continue
[[ $pass != *[0-9]* ]] && continue
echo "$pass"
break
done
}
过滤过程效率低下,但基本上仍然是瞬时的。密码的安全性较低,但可以在未阅读 NIST 关于密码复杂性指南
的网站上使用这是一个基于 @Cyrus 的答案,具有更好的熵和一行中的多个密码:
for i in $(seq 1 5); do echo $(tr -dc 'A-Za-z0-9!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~' < /dev/urandom | head -c 20); done
它将生成五个20字节的密码。
egS<Fp]Y,G>fj@(z1TeB
i^B/juv$%,hJ.tSJzZ=(
te<I&9-/[Wq2,jjd[8fO
t6o"]vmV!arLowG*VCW,
zWiRZuH}q=PfX6Tk++>5