moblie Asked: 2018-09-21 06:21:40 +0800 CST2018-09-21 06:21:40 +0800 CST 2018-09-21 06:21:40 +0800 CST 单线生成一个容易记住的密码?[复制] 772 什么是生成易于记忆的密码的好单行代码,例如 xkcd 的正确马电池钉或比特币种子? 编辑 1: 这与生成随机字符串不同,因为随机字符串根本无法记忆。与强制性 xkcd 相比... shell-script scripting 10 个回答 Voted Best Answer meeDamian 2018-09-21T10:50:00+08:002018-09-21T10:50:00+08:00 首先,安装一个你熟悉的语言的字典,使用: sudo apt-get install <language-package> 要查看所有可用的软件包: apt-cache search wordlist | grep ^w 注意:所有安装说明都假定您使用的是基于 debian 的操作系统。 安装字典后运行: WORDS=5; LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${WORDS} | paste -sd "-" 这将输出前: blasphemous-commandos-vasts-suitability-arbor 分解它: WORDS=5;- 选择您想要在密码中包含多少个单词。 LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words- 只选择包含小写字母字符的单词(它不包括其中包含的单词'或时髦的字符,如 in éclair)。LC_ALL=C确保[a-z]在正则表达式中不会匹配没有变音符号的小写字母以外的类似字母的符号。 shuf --random-source=/dev/urandom -n ${WORDS}—根据您的要求选择尽可能多的单词。--random-source=/dev/urandom确保shuf安全地为其随机生成器播种;没有它,shuf默认为安全种子,但在某些系统上可能会退回到非安全种子,例如 Windows 上的某些 Unix 仿真层。 paste -sd "-"-- 使用(随意将符号更改为其他内容)连接所有单词。 或者,您可以将其包装在一个函数中: #!/bin/bash function memorable_password() { words="${1:-5}" sep="${2:--}" LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${words} | paste -sd "$sep" } 或者 #!/bin/sh memorable_password() { words="$1" if [ -z "${words}" ]; then words=5 fi sep="$2" if [ -z "${sep}" ]; then sep="-" fi LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${words} | paste -sd "$sep" } 两者都可以这样调用: memorable_password 7 _ memorable_password 4 memorable_password 返回: skipped_cavity_entertainments_gangway_seaports_spread_communique evaporated-clashes-bold-presuming excelling-thoughtless-pardonable-promulgated-forbearing 奖金 对于不需要安装字典的书呆子和有趣但不是非常安全的密码,您可以使用(@jpa 提供): WORDS=5; man git | \ tr ' ' '\n' | \ egrep '^[a-z]{4,}$' | \ sort | uniq | \ shuf --random-source=/dev/urandom -n ${WORDS} | \ paste -sd "-" R.. GitHub STOP HELPING ICE 2018-09-21T18:40:34+08:002018-09-21T18:40:34+08:00 我不会使用未考虑加密使用的标准实用程序来执行此操作。没有理由相信他们正在使用 csPRNG 或他们正在正确地播种它,并且知道您的方法的人将能够复制您的密码。同样,如果您不确定如何正确使用多功能实用程序,请使用它们。 pwqgen从passwdqc. frostschutz 2018-09-21T06:35:00+08:002018-09-21T06:35:00+08:00 你需要一本字典,因为你提到了比特币,你很可能想要这个: https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt 如果您的母语不是英语,则在同一存储库中还有其他语言的词汇表。 鉴于此 english.txt 文件,您可以使用以下命令进行随机选择shuf: $ shuf -n 4 english.txt anchor neck trumpet response 请注意,要获得真正安全的密码短语,您需要的不仅仅是 4 个单词。4 个字用于在线服务,攻击者可能进行的尝试次数非常有限。我认为比特币推荐是 16 个字,不确定。 同样在此示例中,每个单词可能只出现一次。如果您希望允许重复单词,请添加--repeat选项: $ shuf -n 4 -r english.txt 这将允许每个单词出现不止一次。 如果你想在一行中输出,你可以添加xargs echo: $ shuf -n 4 english.txt | xargs echo math easily cube daughter 或者,如果您更喜欢命令替换: $ echo $(shuf -n 4 -r english.txt) photo milk roast ozone 在旁注中,我发现这种密码风格不容易记住。 好吧,实际上我很幸运,math easily cube daughter因为这恰好使您很容易想到一个故事,您的女儿可以轻松地用立方体或其他东西做数学。这是人类可以与之相关的东西,就像 XKCD 示例中的马一样。 但到底是什么anchor neck trumpet response?我不是一个有创造力的漫画书作者来想出一个助记符。所以很快就会被遗忘。 即使你能记住单词,也很难记住它们的正确顺序。是它math easily cube daughter还是daugher easily math cube别的什么? 并且密码应该是随机的,你不能选择和修改它。 至于比特币种子,你真的不应该记住它们。这只是一种能够轻松写下来的方法。任何人都可以在一张纸上写下 16 个单词并正确读回;使用随机字母更容易出错。 如果您担心 的随机性shuf,请将--random-source=/dev/urandom参数添加到所有shuf命令中。 另请参阅https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html#Random-sources glenn jackman 2018-09-21T06:28:24+08:002018-09-21T06:28:24+08:00 我有这个: xkcd_password () { command grep "^[[:alpha:]]\{5,8\}$" "${1-/usr/share/dict/words}" | sort --random-source=/dev/urandom -R | head -4 } pLumo 2018-09-21T06:29:02+08:002018-09-21T06:29:02+08:00 尝试这个, shuf --random-source=/dev/urandom -n5 /usr/share/dict/words | sed 's/[^[:alnum:]]//g' | paste -sd_ 输出: Quayles_knockwursts_scrotums_Barrie_hauler 说明: shuf --random-source=/dev/urandom -n5 /usr/share/dict/words从 dict 文件中获取 5 个随机单词 sed 's/[^[:alnum:]]//g'删除非字母数字字符 paste -sd_, 用下划线 ( _)连接单词 您可以使用 Internet 上的任何单词列表文件,而不是/usr/share/dict/words. 如果您没有单词表,请安装它。它可能在您的发行版存储库中,例如https://packages.debian.org/sid/wordlist: sudo apt install wamerican dr_ 2018-09-21T23:12:27+08:002018-09-21T23:12:27+08:00 正如@R.. 所建议的那样,但对于 RHEL/CentOS 机器(可在 EPEL 存储库中获得): pwgen 请注意 pwgen 手册页的摘录(重点是我的): pwgen 程序生成的密码旨在让人类轻松记忆,同时尽可能安全。 人类记忆密码永远不会像完全随机的密码那样安全。 frostschutz 2018-09-22T04:29:26+08:002018-09-22T04:29:26+08:00 如果您希望它更容易记住,您还可以使用密码散列方法(记住一个密码以生成许多其他密码)。无需记住数百个密码短语,您只需记住生成密码的方法即可。 使用shufwithopenssl提供种子随机源,您可以根据需要重新生成密码。请注意,这种方法的安全性仅取决于密码的强度,因此请务必考虑在内。 在以下示例中,随机种子取决于 你的密码(显然) 一个指定的目的(user@site, wallet#number, 不管) 使用的词表(散列) 要求的字数 改变其中任何一个,你都会得到不同的结果。 get_seeded_random() { seed=$(printf "%s:" "$@") openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \ < /dev/zero 2>/dev/null } get_random_words() { dictionary=$1 number=$2 passphrase=$3 purpose=$4 dictionary_hash=$(sha1sum < "$dictionary") shuf -n "$number" \ --random-source=<(get_seeded_random "$passphrase" "$purpose" "$dictionary_hash" "$number") \ "$dictionary" \ | xargs echo } 所以,如果我的密码是WienerSchnitzel(由于显而易见的原因不是一个好的选择),并且如果我到处使用 XKCD 风格的密码: $ get_random_words english.txt 4 WienerSchnitzel wallet:1 robust lottery ugly stone $ get_random_words english.txt 4 WienerSchnitzel wallet:2 vapor comfort various bitter $ get_random_words english.txt 4 WienerSchnitzel [email protected] any actor tobacco tattoo 你可以多次执行它,总是给出相同的结果: $ get_random_words english.txt 4 WienerSchnitzel wallet:1 robust lottery ugly stone $ get_random_words english.txt 4 WienerSchnitzel wallet:1 robust lottery ugly stone 但是再请求一个单词是完全不同的结果(就像使用不同的字典等一样): $ get_random_words english.txt 5 WienerSchnitzel wallet:1 crash category extra hollow cloud 这种方法的缺点是,如果有人知道您正在使用此方法,他们可以尝试暴力破解您的秘密密码,然后继续生成您的所有其他密码。 在这个例子中,很快就能猜出 WienerSchnitzel。为了改善这一点,您需要对密码本身应用一个昂贵(但可重复)的哈希。 # poor man's expensive hash replacement seed=$( (echo "$seed" ; head -c 1G /dev/zero) | sha1sum) 并且首先使用更好的密码。 你也可以硬编码一个真正随机的高熵密码,但这完全违背了事物“容易记忆”的一面。 此外,此实现依赖于 shuf 始终以相同的方式选择单词,从长远来看,未来版本可能并非如此。 l0b0 2018-09-23T00:09:23+08:002018-09-23T00:09:23+08:00 为了完整性: git clone [email protected]:victor-engmark/xkcd-passphrase-generator.git cd xkcd-passphrase-generator ./generate.sh user141424 2018-09-24T17:54:01+08:002018-09-24T17:54:01+08:00 简而言之: random.sample(open("/usr/share/dict/words").readlines(), 4) 产生例如: ['controverts\n', "Queensland's\n", 'plaids\n', 'aback\n'] 完整的代码会更长一些,就像, import random; print("".join(random.sample(open("/usr/share/dict/words").readlines(), 4))) Weyden Geronimo's Jidda enumerate 从好的方面来说,你偶尔会得到这样的 perls: polyamory replicates unmarried diseases 不利的一面是,您可能会得到难以拼写甚至键入的单词: fezzes Lumière's tercentenary's Liliuokalani 当然,如果您要从多个选项中选择一个输出,则会大大缩小搜索空间,因此您必须坚持使用第一组(即真正随机的)单词。 RichVel 2018-09-27T22:31:30+08:002018-09-27T22:31:30+08:00 xkcdpass是一种无需编写单行代码的简单方法。 $ xkcdpass optimal mycology Kumamoto thorny chrism unsavoury 有设置字数等的选项。 安装: Linux/Unix/macOS:(pip install xkcdpass您可能需要sudo)。 如果您没有 Python / pip,请查找和 , 之类的包python,python-pip用于 Python 2 或 3。
首先,安装一个你熟悉的语言的字典,使用:
要查看所有可用的软件包:
注意:所有安装说明都假定您使用的是基于 debian 的操作系统。
安装字典后运行:
这将输出前:
分解它:
WORDS=5;
- 选择您想要在密码中包含多少个单词。LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words
- 只选择包含小写字母字符的单词(它不包括其中包含的单词'
或时髦的字符,如 inéclair
)。LC_ALL=C
确保[a-z]
在正则表达式中不会匹配没有变音符号的小写字母以外的类似字母的符号。shuf --random-source=/dev/urandom -n ${WORDS}
—根据您的要求选择尽可能多的单词。--random-source=/dev/urandom
确保shuf
安全地为其随机生成器播种;没有它,shuf
默认为安全种子,但在某些系统上可能会退回到非安全种子,例如 Windows 上的某些 Unix 仿真层。paste -sd "-"
-
- 使用(随意将符号更改为其他内容)连接所有单词。或者,您可以将其包装在一个函数中:
或者
两者都可以这样调用:
返回:
奖金
对于不需要安装字典的书呆子和有趣但不是非常安全的密码,您可以使用(@jpa 提供):
我不会使用未考虑加密使用的标准实用程序来执行此操作。没有理由相信他们正在使用 csPRNG 或他们正在正确地播种它,并且知道您的方法的人将能够复制您的密码。同样,如果您不确定如何正确使用多功能实用程序,请使用它们。
pwqgen
从passwdqc
.你需要一本字典,因为你提到了比特币,你很可能想要这个:
https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
如果您的母语不是英语,则在同一存储库中还有其他语言的词汇表。
鉴于此 english.txt 文件,您可以使用以下命令进行随机选择
shuf
:请注意,要获得真正安全的密码短语,您需要的不仅仅是 4 个单词。4 个字用于在线服务,攻击者可能进行的尝试次数非常有限。我认为比特币推荐是 16 个字,不确定。
同样在此示例中,每个单词可能只出现一次。如果您希望允许重复单词,请添加
--repeat
选项:这将允许每个单词出现不止一次。
如果你想在一行中输出,你可以添加
xargs echo
:或者,如果您更喜欢命令替换:
在旁注中,我发现这种密码风格不容易记住。
好吧,实际上我很幸运,
math easily cube daughter
因为这恰好使您很容易想到一个故事,您的女儿可以轻松地用立方体或其他东西做数学。这是人类可以与之相关的东西,就像 XKCD 示例中的马一样。但到底是什么
anchor neck trumpet response
?我不是一个有创造力的漫画书作者来想出一个助记符。所以很快就会被遗忘。即使你能记住单词,也很难记住它们的正确顺序。是它
math easily cube daughter
还是daugher easily math cube
别的什么?并且密码应该是随机的,你不能选择和修改它。
至于比特币种子,你真的不应该记住它们。这只是一种能够轻松写下来的方法。任何人都可以在一张纸上写下 16 个单词并正确读回;使用随机字母更容易出错。
如果您担心 的随机性
shuf
,请将--random-source=/dev/urandom
参数添加到所有shuf
命令中。另请参阅https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html#Random-sources
我有这个:
尝试这个,
输出:
说明:
shuf --random-source=/dev/urandom -n5 /usr/share/dict/words
从 dict 文件中获取 5 个随机单词sed 's/[^[:alnum:]]//g'
删除非字母数字字符paste -sd_
, 用下划线 (_
)连接单词您可以使用 Internet 上的任何单词列表文件,而不是
/usr/share/dict/words
.如果您没有单词表,请安装它。它可能在您的发行版存储库中,例如https://packages.debian.org/sid/wordlist:
正如@R.. 所建议的那样,但对于 RHEL/CentOS 机器(可在 EPEL 存储库中获得):
请注意 pwgen 手册页的摘录(重点是我的):
如果您希望它更容易记住,您还可以使用密码散列方法(记住一个密码以生成许多其他密码)。无需记住数百个密码短语,您只需记住生成密码的方法即可。
使用
shuf
withopenssl
提供种子随机源,您可以根据需要重新生成密码。请注意,这种方法的安全性仅取决于密码的强度,因此请务必考虑在内。在以下示例中,随机种子取决于
user@site
,wallet#number
, 不管)改变其中任何一个,你都会得到不同的结果。
所以,如果我的密码是
WienerSchnitzel
(由于显而易见的原因不是一个好的选择),并且如果我到处使用 XKCD 风格的密码:你可以多次执行它,总是给出相同的结果:
但是再请求一个单词是完全不同的结果(就像使用不同的字典等一样):
这种方法的缺点是,如果有人知道您正在使用此方法,他们可以尝试暴力破解您的秘密密码,然后继续生成您的所有其他密码。
在这个例子中,很快就能猜出 WienerSchnitzel。为了改善这一点,您需要对密码本身应用一个昂贵(但可重复)的哈希。
并且首先使用更好的密码。
你也可以硬编码一个真正随机的高熵密码,但这完全违背了事物“容易记忆”的一面。
此外,此实现依赖于
shuf
始终以相同的方式选择单词,从长远来看,未来版本可能并非如此。为了完整性:
简而言之:
产生例如:
完整的代码会更长一些,就像,
从好的方面来说,你偶尔会得到这样的 perls:
不利的一面是,您可能会得到难以拼写甚至键入的单词:
当然,如果您要从多个选项中选择一个输出,则会大大缩小搜索空间,因此您必须坚持使用第一组(即真正随机的)单词。
xkcdpass是一种无需编写单行代码的简单方法。
有设置字数等的选项。
安装:
pip install xkcdpass
您可能需要sudo
)。python
,python-pip
用于 Python 2 或 3。