安全なパスワード履歴を実装する方法


23

セキュリティ上の理由から、パスワードはプレーンテキストで保存しないでください。ハッシュを保存する必要があります。また、レインボーテーブル攻撃を防ぐために、ハッシュを慎重に生成する必要があります。

ただし、通常、最後のn個のパスワードを保存し、最小限の複雑さと異なるパスワード間の最小限の変更を強制する必要があります(ユーザーがPassword_1、Password_2、...、Password_ nのようなシーケンスを使用できないようにします)。これはプレーンテキストパスワードでは簡単ですが、ハッシュのみを保存することでどのようにできますか?

つまり、安全なパスワード履歴メカニズムをどのように実装できるのでしょうか?


2
関連:security.stackexchange.com/questions/4704/…(そして、このサイトはこの質問のより良い場所かもしれません)。「最小限の変更」に関しては、「最小限の変更」(定義によってはLOTになる可能性があります!)と見なされるすべてのオプションを生成し、ハッシュを比較する代替案は考えられません。「最小限の変化」の定義は何ですか?
ケビンフェルメール

7
最新のn個のパスワードのみを保存するということは、ユーザーが1からn + 1までのシーケンスを選択することを意味します。
ヨアヒムザウアー

11
このようなパスワードポリシーによりセキュリティが向上することは非常に懐疑的です。私見、それは人々が付箋紙にパスワードを保持することに頼る可能性を高めます。Kevinのリンクは良い議論です。@KevinVermeer-実際には、変化量をレーベンシュタイン距離(en.wikipedia.org/wiki/Levenshtein_distance)として測定できます。これは「距離の編集」とも呼ばれます。
ネイサンロング

5
セキュリティがこれほど厳しい場合は、ユーザーのランダムパスワードを生成し、強制的に使用させ、定期的に変更することもできます。そうすれば、パスワードを完全に制御できます。
-Reactgular

2
@nathan:付箋紙にパスワードを保存することは実際には安全です。付箋に物理的にアクセスできない限り、パスワードを攻撃することはできません-脅威の約99%を排除します。そのメモを財布や財布の中に入れれば、基本的には人をマグカップに入れて手に入れる必要があります。つまり、セキュリティ侵害が特定され、軽減できるということです。
マッテンツ

回答:


22

ログイン時にパスワードを検証するのと同じ方法で、ハッシュを保存し、保存されたハッシュに対して入力されたパスワードを検証します。「最小限の」変更を検出するには、数値パターンに基づいて指定されたパスワードから「代替」パスワードを生成する必要があります。

ログイン時に、入力されたパスワードをすでにハッシュに対して検証します。パスワードをプレーンテキストで保存する必要はありません。パスワードの変更に関しては、同じトリックが機能します。入力された「最小限の変更」のパスワードを履歴ハッシュと照合するだけです。新しいパスワードで十分な場合は、現在のパスワードハッシュを履歴セットに移動し、新しいパスワードの新しいハッシュに置き換えます。


したがって、ユーザーがPassword6を入力した場合、数値部分を検出し、たとえばPassword4Password5Password7などを試してください。あれは正しいですか?
Wizard79

4
@ロレンツォ:正しい。代替案の生成は、必要に応じて複雑にすることができます。複雑さとリスクの間で適切なトレードオフを見つけるようにしてください(リスクである可能性をゼロにして、すべての可能性を確認しながらユーザーを5分間待たせないでください)。
マーティンピーターズ

最後に数字を増やすことは、ユーザーに提案するのに良い提案であることを私は確信していません-それはほんの少し予測可能です。ユーザーにそうするように指示している場合は、指数関数的に増加します。
ワイアットバーネット

2
@WyattBarnett:ユーザーにそうするように言っている人はいません。ポイントは、そうしているユーザーを検出し、「増分」パスワードが使用されないようにすることです。
マーティンピーターズ

ああ、ここで何かを完全に読み間違えました。ごめんなさい。
ワイアットバーネット

28

ユーザーがパスワードを変更する場合、以前のパスワードの入力を要求します。データベースにプレーンテキストパスワードを保存していない場合でも、2つのプレーンテキストパスワードにアクセスできるようになりました。

これら2つのパスワードで必要な検証を実行します。これにより、ユーザーが2つのパスワードを切り替えることを防ぐことはできません(接尾辞付き-他の回答の提案ごとに直接交替を防ぐことができます)が、より露骨なケースは防ぎます。


これは、n個の以前のパスワードに対してテストする必要がない場合、確かに賢明な回避策ですが、ジャストインタイムで代替を生成することをお勧めします。しかし、両方のパスワードの代替を生成することはさらに良いです!
Wizard79

2
@Lorenzo:アイデアは、n個の以前のパスワードに対して直接テストを行い、最後のパスワードに対してより強力なテストを行うことです。それは妥協です。
ブライアン

はい。現在のパスワードがでpotatoSalad1あり、に更新したい場合、potatoSalad2その時点で両方のプレーンテキストパスワードがあるため、変更が小さすぎると伝えます。しかし、それよりも後の時点では、ハッシュしかありません。ハッシュの性質は、2つのハッシュが入力として類似または完全に異なるプレーンテキストを持っているかどうかを判断できないことです。
ネイサンロング

7

@martijnPieterの答えに追加するには、新しいパスワードと以前のパスワード(どちらも使用可能)に基づいて短いブルートフォースを実行することにより、最小限の変更を実装できます。

たとえば、新しいパスワードから1または2のハミング距離ですべてのパスワードを反復処理し、古いパスと一致するかどうかを確認できます

ただし、これにより、パスワードをハッシュしているというユーザーの信頼性が低下する可能性があります(基本的に、以前のパスワードを取得して新しいパスワードを拒否できると言っているため)


ただし、2月2012-> 3月2012またはFri-09-28-12-> Tue-11-27-12(日付)、Password_Alpha-> ​​Password_Beta、Pass_1111-> Pass_2222、Pass_qwer、Pass_tyuiなど、より大きなハミング距離を持つシーケンスが多数あります。 Pass、_op []、またはEleven-> Twelve(代替カウントシステム)、またはFrankSmith-> FredJones-> FriarTuckまたは怒り-> animal-> apple(企業ディレクトリ内の名前または辞書内の単語)以前のパスワードは簡単に推測できますが、アルゴリズムの生成は非常に困難です。
ケビンフェルメール

@KevinVermeerはバリエーションジェネレーターのアカウントを作成し、すべてを取得できないことを受け入れます
ラチェットフリーク

自信を減らすために+1。私のパスワードが3か月前に使用したパスワードとあまりにも似ていると言ったものを見ると、それらが可逆的に保存されているのか、それとも素晴らしいプログラマーがいるのか、すぐに疑問に思います。通常、懐疑主義が勝ちます。
ティムポスト

5

これは、@ Brianの賢明な答えに対する実際の補遺です。また、@ Martijn Pietersは、現在のパスワードに基づいて古いパスワードをブルートフォースする方法についての詳細と、「ハミング距離」について@ratchet freakに追加しました。答えを削除するわけではありません。なぜなら、それはそれらをバックアップする興味深い背景を提供すると思うからです。

最先端のパスワードストレージでは、ユーザーごとに一意のソルト(128ビット以上)を備えた強力な一方向暗号ハッシュ(SHA-512 +)を複数回使用する必要があります。ただし、各パスワードに関する追加情報を保存しようとしないでください。各パスワードについて保存する情報が多いほど、ハッシュアルゴリズムのセキュリティが損なわれます。

次のことがわかっている場合、パスワードをブルートフォースするのがどれほど簡単になるかを検討してください。

  • 7文字の長さです
  • 文字3〜5は大文字です(4は小文字)
  • 1と7は数字です
  • 6はシンボルです

USキーボードには95文字の印刷可能な文字があるため、パスワードが7文字の長さであることを知ると、95 ^ 7 = 69,833,729,610,000 = 7x10 ^ 13の順列になります。本当にランダムな場合、1つの3Ghzプロセッサでこれを解読するには1年かかるかもしれません。しかし:

  • 大文字と小文字は26文字のみです
  • これらの2つの数値に対して100の可能性をもたらす10桁のみがあります。
  • シンボルは32個のみです

だから(@Hellionのおかげで修正済み):

         26^4 (charcters 2-5 are known upper or lower-case)
        x 100 (characters 1 & 7 are digits)
        x  32 (character 6 is a symbol)
         ====
1,462,323,200 possible passwords.

これは50,000倍簡単にクラックできます!この場合、同様のパスワードを防ぐために適切な情報を保存することで、7文字のパスワードのクラック時間を1年から数時間に短縮できました。優れたビデオカードと少しの忍耐を備えた強力なマルチプロセッサデスクトップですべてのパスワードをデコードすることは、現在非常に実現可能です。この簡単な例が、類似のパスワードをより意味のあるものと比較できるほど、ハッシュの安全性が低下することを実証することを願っています。

強力なハッシュの重要性

パスワード付きのデータベースは定期的に盗まれ、毎月ニュースで巨大な侵入があります。さて、ちょうど先月、SCの州は皆の社会保障番号を失いました -おっと!これらの違反のうちどれだけが隠蔽されますか?

おわりに

私にとって最も恐ろしいのは、複数のサイトに同じまたは類似のパスワードを選択することです。これにより、1つのサイトに侵入すると、攻撃者はすべてのサイトにアクセスできます。最も一般的な不正なパスワードを防止することは、個々のユーザーが同じサイト内で不正なパスワードを再利用することを防止するよりも役立つと思いますが、そのような状況を防止する実証済みの方法を見たいです。私が提案できる最善の方法は、安全なパスワードマネージャーを使用して、ユーザーごとに非常にランダムなパスワードを生成し、安全に保存するという会社全体のポリシーです。


1
マイナーnit:パスワードの可能性はまだ乗法なので、(26 ^ 4)* 100 * 32 = 1,462,323,200です。クラッキング(95 ^ 7)の可能性に1年かかると仮定した場合、この少数の可能性のクラッキングには約11分かかります。
ヘリオン

@Hellion-おっと!それを指摘してくれてありがとう。修正しました。
グレンペターソン

1

まず、最後の「n」個の以前のパスワードのハッシュを保存して、新しいパスワードが以前のパスワードと重複しているかどうかを確認できます。また、現在のパスワードのプレーンテキスト(ログインしているか、パスワード変更要求を認証するために提供されているため)と新しいパスワードがあるため、これら2つのパスワード間の最小限の変更を確認できます。

(あなたにとって)これらの2つのパスワードを「n」個の以前のパスワードと直接比較することが非常に重要な場合、後でそれらを取得できるように、これらのパスワードを(暗号化して)保存する必要があります。

これを行うことはセキュリティ上の欠陥と見なすことができますが、十分なセキュリティを提供するために暗号化メソッドを実装することができます。

  1. 最後の「n」個のパスワードについて、各パスワードを(暗号化された)保存します。
  2. 最新のパスワードが作成された日付と時刻を保存します。
  3. 最新のパスワードのハッシュを保存します。
  4. 現在のパスワードのハッシュ(ソルト)、パスワード作成タイムスタンプ、およびおそらくアカウント番号やメールアドレスなどを使用して、すべてのパスワードを暗号化します。
  5. 新しいパスワードが作成されるたびに、すべてのパスワードを暗号化解除および再暗号化します。

その後、パスワードが変更されるたびに、古いパスワードをすべて暗号化解除し、最小限の変更テストをすべて実行できます。

今、誰かがこの人のパスワードを持っていて、他のすべての必要な詳細を知っていれば、この人のためにこの情報を暗号化解除できます。ただし、このユーザーのパスワードを既に持っている場合は、既にこのユーザーとしてログインし、このユーザーのアカウントにアクセスできます。

また、古いパスワードの場合、厳密なプレーンテキストで保存する必要はありません。それらは、難読化された方法で保存できます。または、パスワード内の文字のアルファベット順リストとして保存されます。

これは一般的なケースで推奨されることではありませんが、説明したタスクがあなたのケースで必要であると仮定すると、これはいくつかのセキュリティ対策でそれを達成する1つの方法です。


この答えは、セキュリティの観点からいくつかのひどい提案をします。パスワードを簡単に解読したり、強力に暗号化するのではなく、「何らかの難読化された方法」で保存したりすることはできません。
user45623
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.