「なぜデータベースにパスワードをそのまま保存しないの?」と疑問に思ったことはありませんか?答えは「ハッシュ化」にあります。

もしDBに平文でパスワードが保存されていたら、不正アクセス一度で全ユーザーのパスワードが流出します。ハッシュ化することで、万が一データが漏れても元のパスワードを復元できないようにしています。この記事では、ハッシュ化の仕組みとアルゴリズムの選び方を解説します。

ハッシュ化とは?

ハッシュ化とは、任意の長さのデータを固定長の文字列(ハッシュ値)に変換する一方向の処理です。次の3つの性質が特徴です。

  • 一方向性:ハッシュ値から元のデータを復元できない(不可逆)
  • 決定性:同じ入力からは必ず同じハッシュ値が生成される
  • 雪崩効果:入力が1文字違うだけでハッシュ値が大きく変わる

例えば「Hello」をSHA-256でハッシュ化すると常に同じ値になります。

SHA-256("Hello") = 185f8db32921bd46d35cc2af78636c3aea7a7b4f19ab4ba82c0dff09b0b43a3

しかし、このハッシュ値から「Hello」を逆算することはできません。

主なハッシュアルゴリズムの比較

アルゴリズム 出力長 速度 セキュリティ
MD5 128bit(32文字) 非常に速い 低(非推奨)
SHA-1 160bit(40文字) 速い 低(非推奨)
SHA-256 256bit(64文字) 普通
SHA-512 512bit(128文字) やや遅い 非常に高

「Hello」のアルゴリズム別ハッシュ値(参考):

MD5    : 8b1a9953c4611296a827abf8c47804d7
SHA-1  : f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0
SHA-256: 185f8db32921bd46d35cc2af78636c3aea7a7b4f19ab4ba82c0dff09b0b43a3

ハッシュ化の実際の使い方

パスワードの安全な保存

パスワードをデータベースに保存するとき、平文のまま保存するのは厳禁です。ただし、SHA-256などの汎用ハッシュもパスワード保存には不向きです。処理が速すぎて、総当たり攻撃(ブルートフォース)に弱いからです。

パスワード保存には bcrypt・Argon2・scrypt などのパスワード専用アルゴリズムを使います。これらは意図的に処理を遅くする設計になっており、計算コストの調整もできます。

// Node.js + bcryptの例
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash('mypassword', 12); // コストファクター12
const isValid = await bcrypt.compare('mypassword', hash); // true

ファイルの改ざん検知(チェックサム)

ダウンロードしたファイルが改ざんされていないか確認するためにSHA-256が広く使われます。配布元が公開しているSHA-256値と、自分でハッシュ化した値が一致すれば、ファイルが正常であることが確認できます。

データの同一性チェック

同じデータが2か所に保存されているか確認したいとき、両方のハッシュ値を比較すれば、巨大なファイル同士でも一致するかどうかを効率よく判断できます。

よくある質問(FAQ)

ハッシュ化と暗号化の違いは何ですか?
暗号化は「鍵」を使って元のデータに戻せる(双方向)変換です。一方、ハッシュ化は元のデータに戻せない(一方向)変換です。パスワード保存にはハッシュ化、送受信するデータの保護には暗号化(AES・RSAなど)を使います。用途が異なるため混同しないようにしましょう。
MD5はまだ使っていいですか?
用途によります。ファイルのチェックサムや重複チェックなど、セキュリティ目的でない場面では今でも使われています。しかし、パスワード保存や認証・デジタル署名などセキュリティが求められる用途では使用しないでください。MD5には衝突が意図的に起こせる脆弱性が発見されており、非推奨です。
同じハッシュ値になること(衝突)はありますか?
理論上はあります。どんなハッシュ関数も出力長が固定である以上、異なる入力が同じ出力になる「衝突」は原理的に存在します。MD5やSHA-1ではすでに意図的な衝突生成に成功した事例があります。SHA-256では現時点で実用的な衝突は発見されていません。

まとめ

  • ハッシュ化は一方向・不可逆の変換で、同じ入力からは常に同じ値が得られる
  • MD5・SHA-1はセキュリティ用途には非推奨。SHA-256以上を使う
  • パスワード保存にはbcrypt・Argon2など専用アルゴリズムを使う
  • ファイルの改ざん検知やチェックサムにはSHA-256が広く使われている

ハッシュ値を実際に計算してみたい場合は以下のツールをご利用ください。