我想使用 gpg -c 和用户生成的密码,以便于我记住。16 个字符够吗?例如,类似于“我拥有 32 栋房子。”的密码是否可以被暴力破解?
答案1
如何生成密码很重要。您为示例选择了三个单词和一个小数字,我猜这三个单词是从数百个单词(也许两千个)的列表中选择的。(至少我似乎认为“2000”是普通人的日常词汇量。)
从 2000 个单词中随机选择一个单词会给你大约 11 位的熵。三个这样的单词将是 33 位。你的数字 32 是五位长,所以让我们假设它贡献了全部五位。在一些非常慷慨的假设下,这是 38 位的熵。现代 GPU 可以在一秒钟左右的时间内解决这个大小的问题,尽管我不知道 GPG 的-c
选项是否包含在现有工具中。无论如何,我认为你的示例密码对任何重要的事情都没有用处。
这是我从朋友 Aaron Toponce 那里得到的一个工具。我可能对它做了一些扩展,因此任何剩余的错误都应该视为我的错误:
gen-pass(){
echo "Generating passwords with 80-bits of entropy"
[[ $(echo "$1" | grep -E '[0-9]+') ]] && NUM="$1" || NUM=1
for I in $(seq 1 "$NUM"); do
strings /dev/urandom | grep -o '[a-hjkmnp-z2-9-]' | head -n 16 | tr -d '\n'
echo # blank string
done | column
}
你可以像这样使用它:
$ gen-pass
Generating passwords with 80-bits of entropy
fx6kycwsktr8v5gq
$ gen-pass 10
Generating passwords with 80-bits of entropy
re784jv4ha9-sxmn ju68qfwwtc88p4cu 9s-m5fv7rg34fgnt 3vazc9hqs2ypk8wr ncceast25bv972h9
gemaq873n7funqnr jj6sq5zwkbmnh9jt s2whnmzv435gdvd6 sctxjk97tb4bar6q 3qvtkg9-d32cd8ch
$
grep -o
跳过像这样的“困难”字符很复杂。i1l o0
因为选择了 32 个字符,所以每个字符提供 5 位安全性:16 个字符乘以 5 位,总共提供 80 位安全性。这比通常的 AES 密钥(具有 128 位安全性)要低得多,但对于人们来说这是一个可以接受的大小。您可以修改示例中的“16”以达到您需要的任何安全范围。(最好也更新输出,以确保您知道使用它时会得到什么。)
使用这个或类似的工具,使用专门设计用于输出具有指定属性的密码的算法来生成密码,比自己尝试随机生成密码要安全得多。