ログイン機能を実装するとき、パスワードの扱いは最も慎重になるべき部分です。平文で保存してしまう、古いハッシュ関数を使ってしまう、ソルトを付け忘れる——こうしたミスは、漏洩したときに被害が一気に広がります。一方で「とりあえずライブラリに任せている」だけだと、なぜそれが安全なのかが分からず、設定を間違えても気づけません。この記事では、パスワードと認証情報を安全に扱うための手順を、強度の設計からハッシュ化の理解、2要素認証、トークンの管理まで、実際にツールで確認しながら順番に整理します。
1. 十分な強度のパスワードを生成する
まず基本として、パスワード自体の強度を理解しておきます。強度は「文字種 × 長さ」で決まり、特に効くのは長さです。8文字の複雑なパスワードより、16文字の単純なパスワードの方が総当たりには強い、というケースは珍しくありません。パスワードジェネレーターで、大文字・小文字・数字・記号のオン/オフと長さを変えながら強度メーターの変化を見ると、どの要素がどれだけ効くのかが体感できます。開発中のテストアカウントや、APIキー・管理者初期パスワードを用意するときにも、その場で生成してそのまま使えます。なお、生成したパスワードを使い回さないこと、そして「推測されやすい単語+数字」のような人間が考えたパターンを避けることが、実務では最も効果的な対策です。
この手順で使うツール
パスワードジェネレーター
文字種・長さを指定して安全なパスワードを即生成
2. ハッシュ関数の違いを理解する(MD5・SHA-1を使わない)
パスワードはそのまま保存せず、ハッシュ化して保存します。ハッシュは「元に戻せない一方向の変換」で、同じ入力からは必ず同じ出力が得られます。ここで重要なのが関数の選択です。MD5 や SHA-1 は既に安全でないとされ、パスワード保存には使ってはいけません。衝突が現実的に発見できることに加え、計算が高速すぎるため総当たり攻撃に有利だからです。Hash Studio で同じ文字列を MD5 / SHA-1 / SHA-256 / SHA-512 で変換してみると、桁数や出力の違いが一目で分かります。また、1文字変えるだけで出力が全く別物になる「雪崩効果」も確認できます。ハッシュはファイルの改ざん検知やETagの生成にも使うので、用途ごとに適した関数を選べるようになっておくと役立ちます。
この手順で使うツール
Hash Studio
MD5 / SHA ハッシュ生成 & 検証
3. パスワード保存にはソルトとストレッチングを使う
前の手順で確認した SHA-256 でさえ、パスワード保存にそのまま使うのは不十分です。理由は2つあります。1つは、同じパスワードなら同じハッシュになるため、事前計算された辞書(レインボーテーブル)で照合されてしまうこと。もう1つは、SHA系は高速に計算できるよう設計されているため、攻撃側が1秒間に膨大な回数の試行をできてしまうことです。この2つを解決するのが、ユーザーごとにランダムな値を混ぜる「ソルト」と、計算を意図的に何度も繰り返して遅くする「ストレッチング」です。実装では自作せず、bcrypt・scrypt・Argon2 といったパスワード専用のアルゴリズムを使います。これらはソルトとストレッチングを内包しており、コスト(計算回数)をパラメータで調整できます。ハードウェアの進化に合わせてコストを上げられる点も、専用アルゴリズムを使う理由です。
4. 2要素認証(TOTP)を追加する
パスワードが漏れても突破されないようにする仕組みが2要素認証です。よく使われる TOTP は、サーバーとアプリで共有した秘密鍵と現在時刻から、30秒ごとに変わる6桁のコードを生成します。通信でコードを送るのではなく両者が同じ計算をするため、盗聴されても次のコードは分かりません。TOTPジェネレーターに秘密鍵を入れると、実際にコードが生成され、残り時間とともに切り替わる様子を確認できます。実装やテストのときに「アプリ側と同じ値が出るか」を突き合わせられるので、時刻ずれ(サーバーとクライアントの時計のずれ)が原因の失敗を切り分けるのにも使えます。実務では、時刻ずれを吸収するために前後の時間帯のコードも許容する設定が一般的です。
この手順で使うツール
TOTP / 2FA Generator
Base32シークレットから RFC 6238 準拠のワンタイムパスワードをブラウザで生成
5. 発行するトークンの中身を確認する
ログインが成功した後は、セッションIDやトークンでユーザーを識別します。JWT を使う場合、トークンには署名が付いており改ざんは検知できますが、ペイロード部分は Base64 でエンコードされているだけで暗号化はされていません。つまり、トークンを持っている人は中身を読めます。JWTデコーダーに実際のトークンを貼り付けると、ヘッダー・ペイロード・署名が分解して表示され、有効期限(exp)の残り時間も確認できます。ここで、パスワードや個人情報など「読まれて困る値」を入れていないか、有効期限が長すぎないかを必ずチェックします。トークンは短めの有効期限にし、リフレッシュトークンで更新する設計が基本です。
この手順で使うツール
JWT Decoder
JWT トークンを即デコード & 検証
まとめ
パスワードの安全な扱いは「強度を確保する → 適切なハッシュ関数を知る → パスワード専用アルゴリズムで保存する → 2要素認証を足す → 発行するトークンの中身を確認する」という流れで整理できます。特に「MD5・SHA-1を使わない」「SHA-256でもパスワード保存には不十分」「bcrypt/scrypt/Argon2を使う」の3点は、実装前に必ず押さえておきたいポイントです。仕組みを理解した上でライブラリを使えば、設定ミスにも気づけるようになります。