单行生成易于记忆的密码?

mob*_*lie 44 scripting password shell-script

什么是生成易于记忆的密码的好单行代码,例如 xkcd 的正确马电池主食或比特币种子?

编辑 1

这与生成随机字符串不同,因为随机字符串根本无法记忆。与强制性的 xkcd 相比......

mee*_*ian 42

首先,安装一个你熟悉的语言的字典,使用:

sudo apt-get install <language-package>
Run Code Online (Sandbox Code Playgroud)

查看所有可用的包:

apt-cache search wordlist | grep ^w
Run Code Online (Sandbox Code Playgroud)

注意:所有安装说明都假设您使用的是基于 debian 的操作系统。

安装字典后运行:

WORDS=5; LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${WORDS} | paste -sd "-"
Run Code Online (Sandbox Code Playgroud)

这将输出 ex:

blasphemous-commandos-vasts-suitability-arbor
Run Code Online (Sandbox Code Playgroud)

分解:

  • 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"
}
Run Code Online (Sandbox Code Playgroud)

或者

#!/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"
}
Run Code Online (Sandbox Code Playgroud)

两者都可以这样调用:

memorable_password 7 _
memorable_password 4
memorable_password
Run Code Online (Sandbox Code Playgroud)

返回:

skipped_cavity_entertainments_gangway_seaports_spread_communique
evaporated-clashes-bold-presuming
excelling-thoughtless-pardonable-promulgated-forbearing
Run Code Online (Sandbox Code Playgroud)

奖金

对于不需要安装字典的书呆子和有趣但不是很安全的密码,您可以使用(由@jpa 提供):

WORDS=5; man git | \
  tr ' ' '\n' | \
  egrep '^[a-z]{4,}$' | \
  sort | uniq | \
  shuf --random-source=/dev/urandom -n ${WORDS} | \
  paste -sd "-"
Run Code Online (Sandbox Code Playgroud)

  • @Braiam 一个 4 个字符的密码,除了每个字符可能有 100000 个不同的值。log2(100000^4) 超过 60 位。 (7认同)
  • 如果所有西里尔文字符都将被`[az]` 范围(在 C 语言环境中)拒绝,则安装西里尔文中的单词列表(例如)就没有什么意义了。 (6认同)
  • 如果 wordlist 不可用,您可以使用 `man git | tr ' ' '\n' | egrep '^[az.]+$'` 用于适当的书呆子密码。如“帮助路径对象控制另一个”或“索引选项 foo.bar 的力量”。 (4认同)

R..*_*ICE 38

我不会使用在设计时没有考虑到加密用途的标准实用程序来执行此操作。没有理由相信他们正在使用 csPRNG 或他们正在正确地播种,并且知道您的方法的人将能够重现您的密码。同样,如果您不确定如何正确使用多功能实用程序,请使用它们。

pwqgenpasswdqc.

  • 值得庆幸的是,/dev/urandom 的设计考虑了密码学的使用。 (11认同)
  • +1。我认为这应该是公认的答案,并会添加几个链接,[“强密码”或“密码生成过程的强度”](https://help.ubuntu.com/community/StrongPasswords) 和 [Project描述 xkcdpass](https://pypi.org/project/xkcdpass/)。-- xkcdpass 在可能的情况下使用密码学上强大的随机数生成器(在大多数现代操作系统上由 random.SystemRandom() 提供)。从版本 1.7.0 回退到不安全的 RNG 必须明确启用 (4认同)

fro*_*utz 13

你需要一个词表词典,因为你提到了比特币,很可能你想要这个:

https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt

如果您的母语不是英语,则同一存储库中还有其他语言的词汇表。

鉴于此 english.txt 文件,您可以使用以下命令进行随机选择shuf

$ shuf -n 4 english.txt 
anchor
neck
trumpet
response
Run Code Online (Sandbox Code Playgroud)

请注意,您需要的不仅仅是 4 个单词才能获得真正安全的密码。4 word 是针对攻击者可能进行的尝试次数非常有限的在线服务。我认为比特币推荐是16个字,不确定。

同样在这个例子中,每个词可能只出现一次。如果您希望允许重复单词,请添加--repeat选项:

$ shuf -n 4 -r english.txt
Run Code Online (Sandbox Code Playgroud)

这将允许每个单词出现不止一次。

如果你想在一行中输出,你可以添加xargs echo

$ shuf -n 4 english.txt | xargs echo
math easily cube daughter
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢命令替换:

$ echo $(shuf -n 4 -r english.txt)
photo milk roast ozone
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我认为这种密码风格不容易记住。

嗯,实际上我很幸运,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` 命令是否使用加密随机数源?否则这是非常有缺陷的。 (3认同)

gle*_*man 10

我有这个:

xkcd_password () { 
    command grep "^[[:alpha:]]\{5,8\}$" "${1-/usr/share/dict/words}" | sort --random-source=/dev/urandom -R | head -4
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道,但较短的单词(对我而言)更容易记住。我在上面发布的 EFF 链接建议使用更短的单词作为替代技术 (3认同)
  • `sort -R` 使用什么样的种子和 prng?可能不适合这种用途。 (2认同)
  • @R .. `sort -R` 和 `shuf` 一样,使用 ISAAC,它被普遍认为是一个很好的 CSPRNG,即使它不是很受欢迎。从 2010 年 10 月发布的 coreutils 8.6 开始,如果可用,CSPRNG 是从 `/dev/urandom` 播种的。 (2认同)

pLu*_*umo 8

尝试这个,

shuf --random-source=/dev/urandom -n5 /usr/share/dict/words | sed 's/[^[:alnum:]]//g' | paste -sd_
Run Code Online (Sandbox Code Playgroud)

输出

Quayles_knockwursts_scrotums_Barrie_hauler
Run Code Online (Sandbox Code Playgroud)

说明

  • 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
Run Code Online (Sandbox Code Playgroud)