ハッシング vs. 暗号化: あなたのパスワードがサーバーに保存される方法

あなたがVerySecureWebsite.comにアカウントを設定したとしましょう。あなたはメールアドレスとパスワードを入力し、アカウントを作成します。少し後、ウェブサイトがハッキングされたとの通知が届くメールを受け取ります。皮肉なことに、全てのユーザーのユーザー名とパスワードがプレーンテキストで保存され、ダークウェブで販売されているとのことです。すべてのアカウントでパスワードを変更し始めるとき(あなたは一つしか使わない、ひどい人ですね)、あなたは思います、「それは悪い考えではないか?ハッカーが読めないように、私のパスワードは何らかの秘密のコードにされるべきではないか?

あなたの言う通りです。ユーザー名とパスワードのログインシステムを使用するウェブアプリやサービスは、ユーザーのパスワードをソルト付きハッシュで保存するべきです。場合によっては、ソルト付きスローハッシュ、あるいはペッパーを使うこともあります。もしこれが暗号学よりも朝食に似ていると感じたら、心配しないでください:あなたのパスワードとは異なり(おそらく)、安全なパスワードストレージはそれほど難しいトピックではありません。

関連記事: ウェブサイトのパスワード制限があなたを守らない理由

プレーンテキストと基本的な暗号化

password-storage-plaintext

ユーザー名入力したパスワード保存形式
UnwittingUserWeakPasswordWeakPassword

インターネット接続されたデータベースにプレーンテキストのパスワードを保存することは非常に悪いアイデアです:もしデータベースがハッキングされた場合、そのパスワードを再利用したユーザーは危険にさらされます。それでも、驚くことに多くのウェブサイトがまだそれを実行しています。おそらく、セキュリティアップグレードは顧客のためであり、企業のためではないからでしょう。そのサイトがこれを行っているかどうかをテストしたいなら、「パスワードを忘れた」オプションを選択してみてください。リセットリンクではなく、単にパスワードを送信する場合、それはプレーンテキストで保存されています。

ユーザー名入力したパスワードAES-128キーで暗号化: WeakKey
UnwittingUserWeakPassword38MkoXVXoKe01uAOROBLpQ==

暗号化はパスワードを保存する強力な方法のように思えるかもしれませんが、実際にはプレーンテキストの一歩上に過ぎません。暗号化されたパスワードは一般的にキーを使ってデコード可能であり、ハッカーがそれを見つけたり推測したりできれば、暗号化は無意味になります。

ハッシング > 暗号化

password-storage-hashing

ユーザー名入力したパスワードハッシュ化する文字列SHA-256でハッシュ

| UnwittingUser | WeakPassword | WeakPassword | 252E2406732308F9A7
B378ED94E78467D14
077D19C8282443FCD
3D6190FCABFA |

ハッシュ関数は基本的に一方向の暗号化です:プレーンテキストのパスワードを秘密のコードに変換しますが、元に戻すためのキーはありません。これは、実際のパスワードをハッシュ化されたバージョンから導き出すことができないことを意味します。

これがほとんどの安全なウェブサイトがパスワードを管理する方法です:

  1. ユーザーがアカウントを作成します
  2. ユーザーのパスワードがハッシュ関数を通過し、データベースに保存されます
  3. ユーザーがログインするたびに、データベースが入力されたパスワードをハッシュ化し、入力されたハッシュがファイル内のハッシュと一致するかどうかを確認します。
  4. 一致する場合、ユーザーはログインできます

ハッシュを使用すると、アプリ/サイトはあなたの実際のパスワードをどこにも保存せず、侵入したハッカーはデコードできない文字と数字のリストしか取得しません。アルゴリズムがどれほど強力かによって、これらのハッシュは非常に難解かもしれません。

ただし、ハッシュはハック不可能ではありません。攻撃者がすべきことは、潜在的なパスワードの辞書をハッシュ関数に通し、それらのハッシュをデータベース内のハッシュと照らし合わせることです。2つのハッシュが一致すると、ハッカーはそのハッシュを生成したパスワードを確認できます。

時間と計算能力を節約するために、多くの攻撃者は事前に生成された潜在的なパスワードとそのハッシュを含むルックアップテーブル(または「レインボーテーブル」、ルックアップテーブルのスペースを省いたバージョン)を使用します。実際、プレーンテキストの単語をハッシュ化してから、自分でそのハッシュに対するルックアップテーブルを使用することができます。これはそれほど難しくありません。基本的に、あなたのパスワードがいかに一般的であっても、そのパスワードのハッシュはすでにルックアップテーブルに存在する可能性が高いです。これは一般的なパスワードを使用しない大きな理由です。

関連記事: これらのヒントとツールを使って強力なパスワードを作成する

ソルト付きハッシュ > ハッシュ

password-storage-salt

| ユーザー名 | 入力したパスワード | ハッシュ化する文字列 | SHA-256でハッシュ、
ソルト = XcyKn42、前に追加 | | — | — | — | — | | UnwittingUser | WeakPassword | XcyKn42WeakPassword | 13EB660FF7FBD29A728FC5
92297D78DF19AFF8797363
15FBF1F1C4B7123BD10C |

スラッグとは異なり、ソルトはハッシュを強化します。プレーンテキストの単語が一文字でも変更されると、ハッシュ全体が変わるため、サイトがルックアップテーブルを無効にするために必要なことは、パスワードをハッシュ化する前に追加のプレーンテキストを加えるだけです。攻撃者は、データベースに保存されているため、プレーンテキストのソルトを読むことができますが、それによって彼らはすべての可能なパスワードとソルトの組み合わせを再計算することを強いられます。

もちろん、ソルト付きハッシュも依然として破られる可能性があります。ハッカーは単に推測しているパスワードにソルトを追加し、組み合わせをハッシュ化し、一致が現れるのを待つことができます - これは標準的な辞書攻撃です。現代のGPUは1秒間に数十億回の推測が可能であるため、これは全く非現実的ではありませんが、プロセスははるかに厄介になります。これに失敗すれば、ブルートフォース攻撃は遅いですが非常に効果的です。

ハッシュをさらに強化する:他の戦術

password-storage-pepper

| ユーザー名 | 入力したパスワード | ハッシュ化する文字列 | Bcryptでハッシュ、
ソルト = XcyKn42、前に追加、
12ラウンド | | — | — | — | — | | UnwittingUser | WeakPassword | XcyKn42WeakPassword | $2y$12$6OleutQBO2iPoNvg
pyDndOU26Lqt9Y34f6PLEOx
mCELP5GoswrJT. |

遅いハッシングアルゴリズム(PBKDF2やbcryptなど)は、「キー伸張」として知られる手法を使用して、辞書攻撃およびブルートフォース攻撃を遅延させます。これは基本的に、ハッシュ関数を特定の回数だけ繰り返すように設定することを含みます(ただし、同じことを何度も繰り返すよりも少し複雑です)、正しいハッシュに到達するには大量の計算能力を使用する必要があります。サイトがこれらすべてを行っている場合、それらのセキュリティは非常に良好です。

| ユーザー名 | 入力したパスワード | ハッシュ化する文字列 | Bcryptでハッシュ、
ソルト = XcyKn42、前に追加、
12ラウンド、
ペッパー = |4|\/|@p3pp3r、後に追加 | | — | — | — | — | | UnwittingUser | WeakPassword | XcyKn42WeakPassword|4|\/|@p3pp3r | $2y$12$njmWr5UMydCzdCE44ElW/
OIfYp2PH9sgonCATyVY.OVKSpmoSaZlu |

追加のセキュリティのために、ハッシュには「ペッパー」を追加することもできます - これはおそらくすでにソルト付きです。ペッパーは、ソルトとは異なり、ハッシュ化される前にパスワードに追加される一連の値です。ただし、ソルトとは異なり、ペッパー値は1つだけであり、秘密に保たれ、ソルトやハッシュとは別に保管されます。これはソルト付きハッシュにさらなるセキュリティ層を追加しますが、攻撃者がそれを見つけてしまった場合、ルックアップテーブルを新たに計算するためにそれを利用できてしまうため、あまり役に立たなくなります。

ハッシュのままでいないでください

パスワードセキュリティは大きな進展を遂げてきました - ハッキング技術も同様です。残念ながら、人間は依然としてパスワード管理が下手であり、データベースは必要以上にセキュリティを更新しません。一般的に、アカウントを作成するたびに、パスワードは比較的弱いセキュリティで保存されていると考えてください。あなたのパスワードが一般的であるか辞書に載っている単語であるなら、それは非常に高い確率で破られるリスクがあります。あなたのパスワードを長くし、文字、数字、記号を混ぜることで、ハッシュ関数が最善を尽くす手助けができるでしょう。

画像クレジット: ハッシュ関数