Xkcdの正しい馬のバッテリーの定番やビットコインの種のように、簡単に覚えやすいパスワードを生成するための優れたワンライナーは何ですか?
EDIT 1:
これは ランダムな文字列を生成する と同じではありません。ランダムな文字列は覚えにくいからです。 必須のxkcd ...と比較してください。
まず、次のコマンドを使用して、使い慣れた言語の辞書をインストールします。
Sudo apt-get install <language-package>
利用可能なすべてのパッケージを表示するには:
apt-cache search wordlist | grep ^w
注:インストール手順はすべて、debianベースのOSを使用していることを前提としています。
辞書をインストールしたら、次のコマンドを実行します。
WORDS=5; LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words | shuf --random-source=/dev/urandom -n ${WORDS} | paste -sd "-"
これはexを出力します:
blasphemous-commandos-vasts-suitability-arbor
分解するには:
WORDS=5;
—パスワードに必要な単語数を選択します。LC_ALL=C grep -x '[a-z]*' /usr/share/dict/words
—小文字のアルファベット文字を含む単語のみを選択します('
が含まれる単語やé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 "-"
暗号化の使用を考慮して設計されていない標準のユーティリティではこれを行いません。彼らがcsPRNGを使用している、または適切にシードしていると信じる理由はなく、あなたの方法を知っている誰かがあなたのパスフレーズを再現することができます。同様に、適切に使用する方法がわからない場合は、多目的ユーティリティを動作させます。
pwqgen
from passwdqc
。
あなたはビットコインに言及しているので、ワードリスト辞書が必要です、おそらくあなたはこれを望みます:
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ワードだと思いますが、わかりません。
また、この例では、各Wordは一度しか表示されません。単語の繰り返しを許可する場合は、--repeat
オプションを追加します。
$ shuf -n 4 -r english.txt
これにより、各単語を複数回表示できます。
出力を1行にしたい場合は、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
か、それ以外の何かでしたか?
また、パスワードはランダムであることが想定されており、選択して変更することはできません。
ビットコインの種に関しては、実際にそれらを覚えておくべきではありません。これは、簡単に書き留めることができる方法です。誰でも1枚の紙に16語を書き留め、正しく読み返すことができます。ランダムな文字を使用すると、間違いを犯す可能性が高くなります。
shuf
のランダム性について懸念がある場合は、--random-source=/dev/urandom
パラメータをすべてのshuf
コマンドに追加します。
参照 https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html#Random-sources
私はこれを持っています:
xkcd_password () {
command grep "^[[:alpha:]]\{5,8\}$" "${1-/usr/share/dict/words}" | sort --random-source=/dev/urandom -R | head -4
}
これを試して、
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_
、単語をアンダースコア(_
)で結合します/usr/share/dict/words
の代わりに、インターネット上の任意のワードリストファイルを使用できます。
ワードリストがない場合はインストールしてください。それはあなたのディストリビューションリポジトリにあるかもしれません、例えば。 https://packages.debian.org/sid/wordlist :
Sudo apt install wamerican
@R ..によって提案されていますが、RHEL/CentOSマシン(EPELリポジトリで利用可能)の場合:
pwgen
Pwgenのマンページからのこの抜粋に注意してください(強調は私のものです):
Pwgenプログラムは、可能な限り安全でありながら、人間が簡単に覚えられるように設計されたパスワードを生成します。 人間が記憶できるパスワードは、完全にランダムなパスワードほど安全ではありません。
さらに覚えやすくしたい場合は、パスワードハッシュアプローチを使用することもできます(単一のパスフレーズから他の多くのパスフレーズを生成することを忘れないでください)。何百ものパスフレーズを記憶する代わりに、それらを生成する方法を記憶するだけです。
shuf
をopenssl
とともに使用して シードされたランダムソース を提供すると、必要に応じてパスフレーズを再生成できます。このアプローチのセキュリティは、パスフレーズの強度のみに依存するため、それを考慮に入れてください。
次の例では、ランダムシードは
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
しかし、もう1つのWordを要求すると、まったく異なる結果になります(別の辞書を使用する場合など)。
$ 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
が常に同じ方法で単語を選択することに依存しています。これは、長期的には将来のバージョンでは当てはまらない可能性があります。
完全を期すために:
git clone [email protected]:victor-engmark/xkcd-passphrase-generator.git
cd xkcd-passphrase-generator
./generate.sh
手短に:
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
逆に、あなたは時々このようなperlを取得します:
polyamory
replicates
unmarried
diseases
欠点としては、スペルが難しい、または入力しにくい単語が表示されることがあります。
fezzes
Lumière's
tercentenary's
Liliuokalani
そしてもちろん、いくつかのオプションから1つの出力を選択する場合は、検索スペースを大幅に絞り込むため、最初の(つまり、真にランダムな)単語のセットに固執する必要があります。
xkcdpass は、ワンライナーを書かずにこれを取得する簡単な方法です。
$ xkcdpass
optimal mycology Kumamoto thorny chrism unsavoury
単語数などを設定するオプションがあります。
インストールするには:
pip install xkcdpass
(Sudo
が必要になる場合があります)。python
やpython-pip
などのパッケージを探して、Python 2または3 。