web-dev-qa-db-ja.com

音声的に記憶に残るパスワード生成アルゴリズム

バックグラウンド

先日ジムにいた時、コンビネーションロックを使って作業していて、プログラマーとして役立つ何かに気づきました。つまり、私の組み合わせは、同じように聞こえるか、覚えやすい他の関係を持つ3つの別々の数字のセットです。たとえば、5-15-25、7-17-2、6-24-5。これらの例は覚えやすいようです

質問

パスワードに似たようなものをどのように実装しますか?はい、それらはクラックしにくいはずですが、エンドユーザーが覚えやすいものでなければなりません。コンビネーションロックは、似たような音の数字と似た性質の数字を組み合わせてそれを行います(7-17-23:すべての素数、17は7の直後に舌から転がり、23は別の素数であり、(アウトそのセットの)、「覚えにくい」もの)。

基準

  • パスワードは覚えやすいものにする必要があります。 _Dog!Wolf_は覚えやすいですが、攻撃者がWebサイトがその組み合わせを提供していることを知ったら、チェックが非常に簡単になります。
  • 単語や文字は、ほとんど同じ音に従う必要があります(ほとんどの場合)。
  • 少なくとも8文字
  • !@#$%^&*();'{}_+<>?,./を使用しないでください。これらの句読点は、「ハード」パスワードには適していますが、「覚えやすい」音はありません。

リソース

この質問は言語に依存しませんが、C#の特定の実装がある場合は、それを聞いてうれしいです。

更新

何人かのユーザーは「これは悪いパスワードセキュリティです」と言っています。 しないでくださいこれはWebサイト用であると想定してください。これは、これらのルールに従ってパスワードを生成するアプリケーションを自分で作成するためだけのものである可能性があります。これが例です。

文字[〜#〜] a [〜#〜] -[〜#〜] c [〜#〜] -[〜#〜] c [〜#〜] -[〜#〜] l [〜#〜] -[〜#〜] i [〜#〜] -[〜#〜] m [〜#〜] -[〜#〜] o [〜#〜] -[〜#〜] p [〜#〜] 'flow'、そしてそれらはたまたま2つの通常の単語を組み合わせたものです(AcclimateMop)。さらに、ユーザーがこれらの文字をと言ったり、単語として言ったりすると、それは実際の単語になります。覚えやすいですが、解読するのは難しいです(明らかに辞書攻撃)。

この質問には2つの部分からなる目標があります。

  1. 似たような文字からパスワードを作成する(頭韻法を使用)または
  2. 一般的な単語を同様にメッシュ化して、辞書にない3番目の文字セットを生成するパスワードを作成します。
48
George Stocker

あなたは見たいかもしれません:

30
Can Berk Güder

まず、パスワードが長いことを確認してください。単一の「パスワード」の代わりに「パスフレーズ」を使用することを検討してください。 「犬とオオカミはお互いを憎む」のようなパスフレーズを破る。非常に難しいですが、覚えるのはとても簡単です。

いくつかのサイトはまたあなたに役立つかもしれないアドバイスを与えるかもしれません 強力なパスワード:それらを作成して使用する方法パスワードチェッカー からリンクされています、それはその上の便利なツールです自分の)。

また、覚えやすいパスワードを作成する代わりに、優れたパスワード管理ユーティリティを使用して(そしてユーザーに使用方法を教育して)、パスワードをまったく覚えないようにする方がはるかに優れている場合もあります( お気に入りのパスワード保存ツール? )-これを行うとき、残っているのは、解読しにくいパスワードを作成することだけです。これは簡単です(十分な長さのランダムな文で十分です)。

19
Suma

http://www.multicians.org/thvv/gpw.html で説明されているMulticsアルゴリズムについて誰も言及していないことに驚いています。これは、FIPSアルゴリズムですが、有向グラフではなく三グラフに基づいています。次のような出力を生成します。

ahmouryleg
thasylecta
tronicatic
terstabble

コードをpythonにも移植しました: http://Pastebin.com/f6a10de7b

12
Joe Koberg

マルコフ連鎖を使用して、英語(または他の任意の言語)のように聞こえる単語を生成できますが、実際の単語ではありません。

覚えやすいという質問は本当に主観的なものなので、このような誰にとっても良いアルゴリズムを書くことはできないと思います。

また、パスフレーズの代わりにWebサイト/コンピューターアプリケーションで短いパスワードを使用するのはなぜですか?それらは覚えやすいですが、割るのは難しいです。

11
Alex Reitbort

何年も経って、パスフレーズの最初の文字を使用することにしました。割ることは不可能で、長さや「数字が必要」などの制限に対応でき、間違いを犯しにくいです。

これは、フレーズを作成することで機能します。 クレイジーで楽しい鮮やかなトピック便利です! 「スタックオーバーフローエイリアンはロケットやホイールを使用せずに着陸しました」。最初の文字を取ります、あなたのパスワードは「soalwurow」です

これを入力できますすばやくおよび正確に文字ごとに覚えていないので、頭の中で文章を話しているだけです。

また、キーボードの左側と右側から単語を交互に使用するのも好きです。これにより、タイピング速度がわずかに速くなり、リズムがより心地よくなります。私の例では、両手が左右交互になっていることに注意してください。

8
SPWorley

次のアルゴリズムを数回使用しました。

  1. すべての小文字の母音(a〜zから)を配列に入れますVowels
  2. すべての小文字の子音(a-zから)を別の配列に入れますConsonants
  3. 2文字の3番目の配列Pairsを作成し、Vowelsの間に可能なすべての文字のペアを作成します。 /および子音( "ab"、 "ba"、 "ac"など...)
  4. Pairsからランダムに3〜5個の要素を選択し、それらを文字列Passwordとして連結します。
  5. trueまたはfalse [.____をランダムに選択します。]
    1. trueの場合、Passwordから最後の文字を削除します
    2. falseの場合、何もしないでください
  6. Password内のランダムに選択された2〜4文字を、同等の大文字に置き換えます
  7. Password内の2〜4個のランダムに選択された文字を、ランダムに選択された整数0〜9に置き換えます

Voilá-これで、5〜10文字の長さのパスワードが必要になり、大文字と小文字の英数字が使用されます。母音と子音を交代で使用すると、それらが半発音可能になり、覚えやすくなります。

6
Henrik Paul

FWIW簡単ですが、本質的にランダムなパスワードのために単語の音節をジャンブルするのがとても好きです。ランダムな単語として「ボンゴ」を例にとってみましょう。 「ゴボン」を取得した音節を交換します。 oを上にあるゼロ(または他の一般的な置換)と交換すると、基本的にランダムな文字シーケンスと、それを覚えるのに役立ついくつかの軌跡が得られます。

プログラムで音節を選択する方法-それはまったく別の質問です!

5
MarcE

ユーザーのパスワードを生成して電子メールで送信する場合、ユーザーにパスワードの変更を強制する場合は、最初にログインするときに最初に行う必要があります。システムによって作成されたパスワードは、一度だけ必要なので、覚えやすい必要はありません。

覚えやすく、推測しにくいパスワードはユーザーにとって便利な概念ですが、システムが何らかの方法で強制する必要のある概念ではありません。ユーザーのGmailアカウントにパスワードを送信し、ユーザーがログイン後にパスワードを変更しないとします。Gmailアカウントのパスワードが侵害されると、システムのパスワードが侵害されます。

したがって、ユーザーがすぐにパスワードを変更する必要がある場合、ユーザーが覚えやすいパスワードを生成することは役に立ちません。そして、彼らがすぐにそれを変更しない場合、あなたは他の問題を抱えています。

4
jmucchiello

私は、ユーザーに「ハード」パスワードを提供し、最初の使用時にパスワードを変更するように要求し、適切な長いパスフレーズを作成する方法についてのガイダンスを提供することを好みます。また、これを妥当なパスワードの複雑さの要件(8文字以上、大文字と小文字の組み合わせ、句読点または数字)と組み合わせます。私の論理的根拠は、人々は自分で選んだものを覚えている可能性がはるかに高く、覚えていればどこかに書き留める可能性が低いということです。

3
tvanfosson

「パスフレーズ」のアイデアのスピンは、フレーズを取り、そのフレーズの各単語の最初の文字を書くことです。例えば。

"A specter is haunting Europe - the specter of communism."

になる

asihe-tsoc

フレーズに!、?などの句読点がある場合は、そこに押し込むこともできます。数字についても同じことが言えます。文字を置き換えるか、関連する数字を最後に追加します。例えば。カール・マルクス(この引用を言った)は1883年に亡くなったので、なぜ「asihe-tsoc83」ではないのですか?

創造的なブルートフォース攻撃は、そのようなパスワードの統計的特性を利用できると確信していますが、それでも辞書攻撃よりも桁違いに安全です。


もう1つの優れたアプローチは、ばかげた言葉を作ることです。 「バランガモップ」。数回使用した後、メモリにコミットしますが、ブルートフォース攻撃は困難です。セキュリティを強化するために、いくつかの数字または句読点を追加します。 「386バランガモップ!」

3
rjh

私は完全にrjhと一緒です。パスフレーズの開始文字を使用するだけの利点は、ランダムに見えることです。これにより、パスワードを入力するときにイブが肩越しに見た場合に、背後のフレーズがわからない場合は覚えにくくなります。
OTOH、あなたが約8文字を入力しているのを見ると、そのうちの「s」が2回、次に「o」と「r」が最初に正しく推測される可能性があります。
少なくとも1桁の使用を強制しても、実際には役に立ちません。あなたは単にknowそれが "pa55Word"または "passw0rd"になることを知っています。

歌詞は無尽蔵のパスフレーズの源です。

"But I should have known this right from the start"

「bishktrfts」になります。 10文字、小文字だけでも10 ^ 15の組み合わせが得られます。これは、特にそれを解読するための近道がないため、たくさんです。 (1秒間に100万の組み合わせで、10 ^ 15のすべての組み合わせをテストするのに30年かかります。)
エキストラとして(イブがあなたが警察のファンだと知っている場合)、交換することができます。 2番目と3番目の文字、または3番目の単語の2番目の文字を取ります。無限の可能性。

2
stevenvh

これが、シェルスクリプトでプロトタイプ化されたアイデアのパート2です。コンピュータ上のUnix辞書ファイルから4、5、および6文字の単語(約50,000)を取得し、それらの単語を最初の文字に連結します。

#! /bin/bash

RANDOM=$$
WORDSFILE=./simple-words
DICTFILE=/usr/share/dict/words
grep -ve '[^a-z]' ${DICTFILE} | grep -Ee '^.{4,6}$' > ${WORDSFILE}
N_WORDS=$(wc -l < ${WORDSFILE})
for i in $(seq 1 20); do
    password=""
    while [ ! "${#password}" -ge 8 ] || grep -qe"^${password}$" ${DICTFILE}; do
        while [ -z "${password}" ]; do
            password="$(sed -ne "$(( (150 * $RANDOM) % $N_WORDS + 1))p" ${WORDSFILE})"
            builtfrom="${password}"
        done
        Word="$(sort -R ${WORDSFILE} | grep -m 1 -e "^..*${password:0:1}")"
        builtfrom="${Word} ${builtfrom}"
        password="${Word%${password:0:1}*}${password}"
    done
    echo "${password} (${builtfrom})"
done

ほとんどのパスワードジェネレータのように、私はそれらを20のセットで出力することによって不正行為をします。これは「セキュリティ」(誰かがあなたの肩越しに見ている)の観点から防御されることがよくありますが、実際には、ユーザーが最もわかりやすいパスワードを選択できるようにするための単なるハックです。

辞書ファイルから4〜6文字の単語がまだあいまいな単語を含んでいるのを見つけました。

言葉のより良い情報源は、書かれた文書でしょう。このページのすべての単語をコピーしてテキストドキュメントに貼り付け、次の一連のコマンドを実行して実際の英語の単語を取得しました。

Perl -pe 's/[^a-z]+/\n/gi' ./624425.txt | tr A-Z a-z | sort -u > ./words
ispell -l ./words | grep -Fvf - ./words > ./simple-words

次に、このページの500ほどの非常に単純な単語を使用して、シェルスクリプトで次のパスワードを生成しました。スクリプトは、パスワードを構成する単語を括弧内に示しています。

backgroundied (background died)
soundecrazy (sounding decided crazy)
aboupper (about upper)
commusers (community users)
reprogrammer (replacing programmer)
alliterafter (alliteration after)
actualetter (actual letter)
statisticrhythm (statistical crazy rhythm)
othereplacing (other replacing)
enjumbling (enjoying jumbling)
feedbacombination (feedback combination)
rinstead (right instead)
unbelievabut (unbelievably but)
createdogso (created dogs so)
apphours (applications phrase hours)
chainsoftwas (chains software was)
compupper (computer upper)
withomepage (without homepage)
welcomputer (welcome computer)
choosome (choose some)

そこにある結果のいくつかは勝者です。

プロトタイプはおそらくそれが可能であることを示していますが、頭韻法や音節情報について必要なインテリジェンスには、単なる単語よりも優れたデータソースが必要です。発音情報が必要です。また、覚えやすいパスワードの要件をより適切に満たすために、all単語ではなく、適切な単純な単語のデータベースを選択する必要があることを示しました。

初めて、そして毎回(Webに必要なもの)単一のパスワードを生成すると、より優れたデータソースとより高度な機能の両方が必要になります。テキストファイルでBashよりも優れたプログラミング言語を使用し、データベースを使用すると、これを即座に機能させることができます。データベースシステムを使用すると、SOUNDEXアルゴリズムなどを使用できます。

きちんとしたアイデア。幸運を。

2
ashawley

gpwツール を見てください。このパッケージは、Debian/Ubuntuリポジトリでも利用できます。

1
Rafał Rawicki

システムで生成されたパスワードは、内部サービスアカウントや一時的なリセット(など)以外にはお勧めできません。

覚えやすいが、推測やブルートフォース攻撃がほとんど不可能な独自の「パスフレーズ」を常に使用する必要があります。たとえば、私の古い大学のアカウントのパスワードはでした。

Here to study again!

これは、大文字と小文字を句読点で使用した20文字です。これは信じられないほど強力なパスワードであり、私にとって覚えやすい、より安全なパスワードを生成できるソフトウェアはありません。

1
Fraser

編集:答えた後、私はこれが決して音声的に記憶に残るものではないことに気づきました。とにかく答えを残してb/c私はそれが面白いと思います。 /編集

古いスレッド、私は知っています...しかし、それは一撃の価値があります。

1)私はおそらくあなたがアンマスできる最大の辞書を作るでしょう。品詞ごとにバケツに並べます。

2)次に、いくつかの種類の文を作成できる文法を作成します。文の「タイプ」は、品詞の順列によって決定されます。

3)ランダムに(または可能な限りランダムに近い)、文のタイプを選択します。返されるのは、品詞のプレースホルダーを持つパターンです(n-v-nは名詞-動詞-名詞になります)

3)プレースホルダーの代わりに、品詞バケットの各部分でランダムに単語を選択します。それらを入力します(上記の例はcar-ate-bicycleのようなものになる可能性があります)。

4)各文字をランダムにスキャンして、類似した文字(または文字のセット)または類似の文字に置き換えるかどうかを決定します。これは問題の最も難しいステップです。

5)結果のパスワードはkaR @tebyCICleのようになります

6)「空手自転車」のようなユーモラスな結果を笑う

1
San Jacinto

単語のように聞こえるパスワードを生成する1つの方法は、マルコフ連鎖を使用することです。 n度のマルコフ連鎖は、基本的に、入力コーパスに出現するnタプルの大きなセットとその頻度です。たとえば、2次マルコフ連鎖を持つ「aardvark」は、タプル(a、a、1)、(a、r、2)、(r、d、1)、(d、v、1)を生成します。 、(v、a、1)、(r、k、1)。オプションで、「仮想」の開始単語トークンと終了単語トークンを含めることもできます。

目的に役立つマルコフ連鎖を作成するには、英語データの大規模なコーパスを入力します。たとえば、Project Gutenburgを含め、多くのデータを使用して、上記の一連のレコードを生成します。少なくともほとんどが文法または構成の規則に従う自然言語の単語または文を生成するには、通常、3次のマルコフ連鎖で十分です。

次に、パスワードを生成するために、セットからランダムな「開始」タプルを選択し、その頻度で重み付けして、最初の文字を出力します。次に、ランダムに(ここでも頻度で重み付けされた)「次の」タプルを繰り返し選択します。つまり、現在のタプルが終わるのと同じ文字で始まり、1文字だけ異なるタプルを選択します。上記の例を使用して、(a、a、1)から開始し、「a」を出力するとします。次の選択肢は(a、r、2)だけなので、別の「a」を出力します。これで、(r、d、1)または(r、k、1)のいずれかを選択できるので、発生頻度に基づいてランダムに1つを選択します。 (r、k、1)を選択するとします-'r 'を出力します。このプロセスは、単語の終わりマーカーに到達するか、独立して停止することを決定するまで続きます(ほとんどのマルコフ連鎖は循環グラフを形成するため、人為的な長さ制限を適用しないと、生成を終了できない可能性があります)。

単語レベル(たとえば、タプルの各要素が単語である)では、この手法は、いくつかの「会話ボット」によって使用され、意味のあるように見えるナンセンスな文を生成します。また、スパマーがスパムフィルターを回避しようとするためにも使用されます。文字レベルでは、上で概説したように、意味のない単語、この場合はパスワードを生成するために使用できます。

1つの欠点:入力コーパスに文字以外のものが含まれておらず、出力フレーズも含まれていない場合、ほとんどの「安全な」パスワード要件に合格しません。いくつかの後処理を適用して、数字や記号の代わりにいくつかの文字を使用することをお勧めします。

1
Nick Johnson

私は本当にlove誰かが「<Ctrl>+N」のような制御文字または「A+C」のようなコンボ文字を同時に使用してパスワードを実装するのを見るでしょう。これを同等のバイナリに変換すると、IMHOは、パスワード要件を覚えやすく、入力が速く、解読しにくくします(チェックする組み合わせがさらに多くなります)。

0
Mike