パスワード
1. セキュリティに欠かせないパスワード
私たちは日々、個人情報の保護・なりすまし被害の防止・金銭的損失の回避・プライバシーの確保などの目的でパスワードを利用しています。ここではそんなパスワードを保護するための技術について学んでいきます。
ハッシュ関数とは?
ハッシュ関数とは、入力されたデータを「あるルールに基づいて」無作為な値(無作為に見える値)に変換します。同じ入力に対して、毎回同じ値を出力します。ハッシュ関数には種類がありますが、ここではセキュリティ用に用いられる暗号的ハッシュ関数を扱います。
固定長の出力
どんなに長いデータを入力しても、ハッシュ関数で出力される値は決まった長さになります。たとえば、「Hello」と「Hello World!!!」のどちらを入れても、出力は同じ桁数になります。
一方向性
一度変換したハッシュ値から元のデータを復元することはできません。加えて、入力値が少しでも変わると、ハッシュ値は大きく変化するので、元の入力を推測することが困難になります。
ハッシュ関数は入力がわずかでも異なると、出力が大きく異なる性質を持ちます。セキュリティにおける、この性質のメリットとして、以下があります。
異なる入力が同じハッシュ値を生成する可能性(衝突と呼ぶ)の低下
衝突が起きにくいため、ハッシュ関数はデータの一意性を保つのに適しています。例えば、データベースでハッシュ値を使ってデータを管理する場合、重複を検出するのに役立ちます。
セキュリティの強化
入力がわずかに異なるだけで出力が完全に変わるため、元の入力を推測することが困難になり、悪意のある第三者が暗号やデジタル署名の元データを推測したり、別のデータにすり替えたりするリスクを大幅に低減します。
データ整合性の検証
データが少しでも改ざんされていれば、ハッシュ値が大きく変わるため改ざんを検出できます。例えば、ダウンロードサイトでファイルのハッシュ値(チェックサム)を提供することで、ユーザーはファイルが改ざんされていないことを確認できます。
パスワードの保護
ユーザーのパスワードを保存する際、ハッシュ化された値だけを保存することで、似たようなパスワード(例: password1 と password2)が全く異なるハッシュ値を生成するため、辞書攻撃や総当たり攻撃が難しくなります。
この性質はアバランチ効果と呼ばれます。
パスワード管理におけるハッシュ関数の役割
パスワードはデータベースにそのまま保存せず、ハッシュ値として保存されます。これにより、仮にデータベースが盗まれても、元のパスワードを簡単には知られることがありません。 サイトがパスワードを照合する際には、ユーザーが入力したパスワードをハッシュ化し、保存されたハッシュ値と一致するかどうかを確認するだけです。
ハッシュだけでは不十分な場合
ソルトやペッパーをハッシュ関数と組み合わせて使うことで、より強力にパスワードを守ることができます。これらは片方だけ使うより、両方使う方が効果的です。
ソルト
ハッシュ関数だけでは、短いパスワードや一般的なパスワード(例えば「123456」など)が容易に推測されることがあります。これに対処するため、ソルトと呼ばれるランダムな文字列(長さに決まりはない)をパスワードに結合したものをハッシュ化して、ソルトとハッシュ値をデータベースに保存します。このソルトはユーザーごとに異なるため、同じパスワードを使っていても、生成されるハッシュは異なります。
ペッパー
ペッパーは、ソルトと似ていますが、全ユーザーで共通の追加情報です。ペッパーは秘密情報として扱われ、データベースには保管されず、別の安全な場所(環境変数やハードウェアセキュリティモジュール)に保持されます。 よって仮にデータベースが漏洩しても、ペッパーが漏れなければパスワードのハッシュを逆算するのは非常に困難になります。
ハッシュ関数の実例
SHA-2 (Secure Hash Algorithm 2)
- 特徴:
- 計算速度は比較的高速だが、パスワード保護に用いるには速度が速すぎるため、そのまま利用するのは適していない。
- 出力値のビット数によって、SHA-256(256bit)、SHA-512(512bit)などがある。
- 用途
- データの整合性検証: ソフトウェアのダウンロード時のハッシュ値比較などを行い、ファイルやメッセージの改ざんを防止。
- ディジタル署名: メッセージや文書の署名を作成する際に使用。
- ブロックチェーン: 暗号通貨(例: Bitcoin)での取引データのハッシュ計算に使用。
bcrypt
- 用途:
- 認証システムでパスワードを保存する。
- 特徴:
- ハッシュ計算を意図的に遅くする「ストレッチング」という技術を用いるため、計算コストが高い。
cost
パラメータにより計算コストを調整可能で、将来的に非常に高い計算力を持つ演算装置が誕生しても、ブルートフォース攻撃に高い耐性を持つ。- 自動的にソルトを生成するので、ユーザがソルトを管理する必要がない。
- 出力は常に
実際にはもっと多様なハッシュ関数があり、データ整合性検証、セキュリティ・暗号化、パスワード保存、通信エラーチェックなどの用途で使い分けられています。
パスワードクラッキング
総当たり攻撃 (Brute Force Attack)
概要
全ての可能な文字列を一つずつ機械的に試す方法です。例えば、パスワードが 4 桁の数値の場合、0000 ~ 9999 までを 1 ずつ増やして試します。短く単純なパスワードであれば短時間で破られる可能性が高くなります。
事例
- Zipファイルのパスワードクラッキング: パスワードが「1234」のように短い場合、総当たり攻撃で数秒で解読可能です。パスワード解析の専用ツール(例: John the Ripper, Hashcat)を使用して効率的に攻撃が行われます。
対策
長いパスワード(最低12文字以上)を使用したり、多要素認証(MFA)を有効化すると良いです。また、ソルトとペッパー(ランダムで一意のデータ)を組み合わせてさらに複雑にし、また長く複雑なパスワードの使用を推奨することで対抗します。
辞書攻撃 (Dictionary Attack)
概要
総当たり攻撃の一種で、辞書にある単語やフレーズを次々に試します。「パスワードがよく使われる単語に基づいている」という人間の習性を悪用したものです。
事例
- LinkedIn データ流出 (2012年): 攻撃者が流出したパスワードハッシュに対して辞書攻撃を行い、「password」「123456」「linkedin」などの単純なパスワードを短時間で特定しました。約1億6500万件のアカウント情報が漏洩しました。
対策
英数字記号を無作為に組み合わせた強固なパスワードを使用したり、パスワードハッシュにソルトを加えることが対策となります。
レインボーテーブル攻撃 (Rainbow Table Attack)
概要
パスワードのハッシュ値と平文の対応表を予め作成しておき、対応するハッシュを照合する攻撃手法です。ハッシュ化のみを頼りにしているシステムを攻撃します。
事例
- Windows XP のパスワードクラッキング:Windows XP のサポートはすでに終了していますが、一部の認証システムではレインボーテーブル攻撃が非常に有効でした。 Windows XP の主な認証システムのうち LM (LAN Manager) ハッシュは、パスワードは最大14文字で前半と後半の7文字ずつに分割されて処理される上に、小文字が自動的に大文字に変換される、といった理由で使用可能な文字セットが限られるため、総当たり攻撃に対しても脆弱でした。また、NTLM (NT LAN Manager) ハッシュは計算コストは高いものの、ソルトを利用しないためレインボーテーブル攻撃に対して脆弱でした。
対策
ソルトを使用したハッシュ化をすることで、対応表の意味をなくすことができます。また、PBKDF2、bcrypt、Argon2 など計算コストの高いハッシュ関数を使用することで、解析される可能性を下げることができます。計算コストとは、ハッシュ値を求める際にかかる計算量のことで、これが大きいほど一つのパスワードを解析する時間が長くなるので、結果的に安全性を高めることができるというものです。
2. 日常でのセキュリティ
ここまで、実際に使われているクラッキング手法とそれに対抗するセキュリティ技術について学んできましたね。では、私たちが日常でできる対策には何があるのでしょうか?
強力なパスワードの必須要素
長さ
10桁以上にすることがよく推奨されます。パスワードは長くなればなるほど、解読が困難になります。
多様な文字の組み合わせ
強力なパスワードには以下の要素を含める必要があります:
- 大文字(A-Z)
- 小文字(a-z)
- 数字(0-9)
- 特殊文字(!@#$%^&*など)
避けるべき事項
以下の要素は使用を避けてください:
- 誕生日や電話番号などの個人情報
- 連続した数字(123456など)
- 一般的な単語
- 複数のアカウントで同じパスワードの使い回し
例えば、ThA5xEKxtZcC
は強力なパスワードだと言えますが、RyoheiTanaka1109
はそうではありません。
追加のセキュリティ対策
さらなるセキュリティ向上のために以下を利用することが推奨されます。
-
二要素認証
- SMS認証
- アプリ認証
- 生体認証
-
パスワード管理ソフト
- 安全な保存
- 自動生成機能
- 暗号化
特に二要素認証はよく利用されていて、重要です。
二要素認証とは?
二要素認証は、以下の3つのカテゴリー(知識、所有、生体)から2つ以上を組み合わせてアカウントを保護する方法です。
-
知っていること(知識)
- パスワード
- PINコード
- 秘密の質問
-
持っているもの(所有)
- スマートフォン
- セキュリティキー
- ICカード
-
体の特徴(生体)
- 指紋
- 顔認証
- 虹彩
なぜ二要素認証が重要なのか
-
パスワード漏洩への対策
パスワードが漏洩しても、第二の認証要素があるため、不正アクセスを防ぐことができます。
-
セキュリティの大幅な向上
不正アクセスのリスクを大幅に減らすことができます。
-
コンプライアンス対応
多くの業界標準やセキュリティ規制で二要素認証の実装が求められています。
主な二要素認証の方式
-
SMS認証
- 例: Google、GitHub
- メリット: 導入が容易
- デメリット: SIMスワップ攻撃のリスク
-
認証アプリ
- 例: Google Authenticator、Microsoft Authenticator
- メリット: 高いセキュリティ、オフライン利用可
- デメリット: 初期設定の手間
-
セキュリティキー
- 例: YubiKey
- メリット: 最も安全な方式
- デメリット: 追加のハードウェアが必要