web-dev-qa-db-ja.com

覚えやすいパスワードを生成するためのワンライナー?

Xkcdの正しい馬のバッテリーの定番やビットコインの種のように、簡単に覚えやすいパスワードを生成するための優れたワンライナーは何ですか?

EDIT 1

これは ランダムな文字列を生成する と同じではありません。ランダムな文字列は覚えにくいからです。 必須のxkcd ...と比較してください。

43
moblie

まず、次のコマンドを使用して、使い慣れた言語の辞書をインストールします。

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 "-"
41
meeDamian

暗号化の使用を考慮して設計されていない標準のユーティリティではこれを行いません。彼らが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 daughterdaugher 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

14
frostschutz

私はこれを持っています:

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

これを試して、

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
8
pLumo

@R ..によって提案されていますが、RHEL/CentOSマシン(EPELリポジトリで利用可能)の場合:

pwgen

Pwgenのマンページからのこの抜粋に注意してください(強調は私のものです):

Pwgenプログラムは、可能な限り安全でありながら、人間が簡単に覚えられるように設計されたパスワードを生成します。 人間が記憶できるパスワードは、完全にランダムなパスワードほど安全ではありません。

4
dr_

さらに覚えやすくしたい場合は、パスワードハッシュアプ​​ローチを使用することもできます(単一のパスフレーズから他の多くのパスフレーズを生成することを忘れないでください)。何百ものパスフレーズを記憶する代わりに、それらを生成する方法を記憶するだけです。

shufopensslとともに使用して シードされたランダムソース を提供すると、必要に応じてパスフレーズを再生成できます。このアプローチのセキュリティは、パスフレーズの強度のみに依存するため、それを考慮に入れてください。

次の例では、ランダムシードは

  • パスフレーズ(明らかに)
  • 指定された目的(user@sitewallet#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が常に同じ方法で単語を選択することに依存しています。これは、長期的には将来のバージョンでは当てはまらない可能性があります。

1
frostschutz

完全を期すために:

git clone [email protected]:victor-engmark/xkcd-passphrase-generator.git
cd xkcd-passphrase-generator
./generate.sh
0
l0b0

手短に:

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つの出力を選択する場合は、検索スペースを大幅に絞り込むため、最初の(つまり、真にランダムな)単語のセットに固執する必要があります。

0
Dima Tisnek

xkcdpass は、ワンライナーを書かずにこれを取得する簡単な方法です。

$ xkcdpass 
optimal mycology Kumamoto thorny chrism unsavoury

単語数などを設定するオプションがあります。

インストールするには:

  • Linux/Unix/macOS:pip install xkcdpassSudoが必要になる場合があります)。
  • Python/pipがない場合は、pythonpython-pipなどのパッケージを探して、Python 2または3 。
0
RichVel