「データを暗号化して保存する」
「パスワードはハッシュ化して保存する」
情報セキュリティについて調べていると、「暗号化」と「ハッシュ化」という言葉をよく目にします。
どちらも元のデータをそのまま読めない形に変換するため、
「暗号化とハッシュ化は同じもの?」
「ハッシュ化したデータは復号できる?」
「パスワードは暗号化して保存すればよい?」
「SHA-256は暗号化?」
「暗号化したファイルとハッシュ値は何が違う?」
と迷うことがあります。
結論からいうと、「暗号化」は、正しい鍵を使えば元のデータへ戻せるように変換することです。一方、「ハッシュ化」は、元データから一定の規則でハッシュ値を生成する一方向の処理で、元のデータへ戻すための「復号」を前提としていません。
一言で覚えるなら、
暗号化=「読めないようにして、必要なら元に戻す」
ハッシュ化=「データから指紋のような値を作る」
です。
たとえば、重要な文書を第三者に読まれないよう保護し、権限を持つ人だけが元の内容を読めるようにしたい場合には、暗号化が使われます。
一方、あるファイルが途中で書き換えられていないか確認したい場合には、ファイルからハッシュ値を計算して比較する方法があります。
NIST(米国国立標準技術研究所)はAESなどの暗号について、平文を読めない暗号文へ変換し、正しい鍵を使った復号によって元の平文へ戻す仕組みを規定しています。
一方、暗号学的ハッシュ関数については、任意長の入力から固定長のハッシュ値を生成し、そのハッシュ値から特定の元データを求めることが計算上困難となる「一方向性」などを重要な性質として挙げています。
この記事では、「暗号化」と「ハッシュ化」の違いから、復号、共通鍵暗号、公開鍵暗号、SHA-256、パスワード保存、ソルト、デジタル署名との違いまで詳しく解説します。
- 「暗号化」と「ハッシュ化」の違い【結論】
- 「暗号化」とは?
- 暗号化の目的は「内容を秘密にすること」
- 「復号」とは?
- 暗号化には「鍵」が重要
- 「共通鍵暗号」とは?
- 「公開鍵暗号」とは?
- 「ハッシュ化」とは?
- ハッシュ値は「データの指紋」のようなもの
- ハッシュ化したデータは「復号」できない
- 「復号できない」=元のパスワードが絶対に分からない?
- 「SHA-256」とは?
- SHA-3とは?
- 暗号化とハッシュ化の決定的な違い
- パスワードは「暗号化」ではなく「ハッシュ化」する?
- 「パスワードをSHA-256でハッシュすれば安全」ではない
- 「ソルト」とは?
- ソルトは秘密にする必要がある?
- 「暗号化」と「エンコード」の違い
- ハッシュ値はデータの改ざん検出に使える
- ハッシュ値が同じなら絶対に同じデータ?
- MD5やSHA-1を使えばよい?
- ハッシュ化とデジタル署名の違い
- ハッシュ化とHMACの違い
- 暗号化とハッシュ化を両方使うこともある
- 暗号化したデータからハッシュ値を作ることもできる?
- 「暗号化・ハッシュ化」で迷ったときの3秒判定
- 「暗号化」を使った例文
- 「ハッシュ化」を使った例文
- 具体例で比較:秘密の文書
- 具体例で比較:ダウンロードファイル
- 具体例で比較:Webサービスのパスワード
- よくある間違い1:「暗号化」と「ハッシュ化」は同じだと思う
- よくある間違い2:「ハッシュ値を復号すれば元データに戻る」と思う
- よくある間違い3:「SHA-256は暗号化方式」だと思う
- よくある間違い4:「パスワードはAESで暗号化すれば十分」と思う
- よくある間違い5:「SHA-256を1回使えば安全なパスワード保存になる」と思う
- よくある間違い6:「Base64は暗号化」だと思う
- よくある間違い7:「ハッシュ値が公開されていると危険」と思う
- 「暗号化」と「ハッシュ化」に関するよくある質問
- まとめ
- 参考リンク・出典
「暗号化」と「ハッシュ化」の違い【結論】
| 比較項目 | 暗号化 | ハッシュ化 |
|---|---|---|
| 主な目的 | データの内容を第三者から隠す | データの要約値・識別値を生成する |
| 元に戻せる? | 正しい鍵があれば戻せる | 元に戻すことを前提としない |
| 元に戻す操作 | 復号 | 「復号」という操作はない |
| 鍵 | 通常、暗号鍵を使用する | 一般的なハッシュ関数そのものには暗号鍵を必要としない |
| 出力 | 暗号文 | ハッシュ値・ダイジェスト |
| 代表例 | AES、RSAを利用した暗号処理など | SHA-256、SHA-3など |
| 主な用途 | データの機密性確保 | 改ざん検出、デジタル署名の構成要素、パスワード保存の仕組みなど |
3秒で判断するなら、
「あとで元のデータを読みたい?」 → 暗号化
「元の内容ではなく、データを識別・検証する値がほしい?」 → ハッシュ化
と考えると分かりやすいでしょう。
「暗号化」とは?
データを読めない形へ変換し、鍵で元に戻せるようにする
暗号化とは、元のデータである、
平文(plaintext)
を、第三者には意味を理解しにくい、
暗号文(ciphertext)
へ変換する処理です。
正しい暗号鍵を利用すれば、暗号文から元の平文を取り戻すことができます。
この元に戻す処理が、
「復号」
です。
NISTのAdvanced Encryption Standard(AES)でも、暗号化はデータを理解できない形へ変換し、復号によって元の形式へ戻す処理として説明されています。
暗号化の目的は「内容を秘密にすること」
暗号化の代表的な目的は、
機密性(confidentiality)
を守ることです。
たとえば、
- パソコン内の重要ファイル
- スマートフォン内のデータ
- クラウドへ保存する情報
- インターネット通信
- 企業の機密情報
などを、権限のない第三者に読まれにくくするために暗号技術が利用されます。
暗号化されたデータを盗まれたとしても、適切な暗号方式と鍵管理が行われていれば、攻撃者が内容を読み取ることを難しくできます。
「復号」とは?
復号とは、暗号化によって読めない形へ変換された暗号文を、正しい鍵を使って元の平文へ戻す処理です。
つまり、
平文 → 暗号化 → 暗号文
暗号文 → 復号 → 平文
という関係です。
この、
「正しい鍵を持つ人なら元に戻せる」
という性質が、ハッシュ化との大きな違いです。
暗号化には「鍵」が重要
暗号方式では、一般に、
暗号鍵
が非常に重要です。
強力な暗号アルゴリズムを使用していても、鍵が第三者へ漏れてしまえば、暗号化した情報を読み取られる可能性があります。
そのため実際のセキュリティでは、
- 安全な暗号方式を使う
- 十分な長さの鍵を使う
- 鍵を安全に保管する
- 必要な人だけが鍵を利用できるようにする
といった鍵管理も重要になります。
「共通鍵暗号」とは?
暗号方式には大きく、
共通鍵暗号
と、
公開鍵暗号
があります。
共通鍵暗号では、基本的に暗号化と復号に同じ秘密鍵を使用します。
代表的な共通鍵暗号が、
AES(Advanced Encryption Standard)
です。
NISTのFIPS 197では、
- AES-128
- AES-192
- AES-256
が規定されています。
数字は使用する暗号鍵のビット長を示しています。
「公開鍵暗号」とは?
公開鍵暗号では、
- 公開してよい「公開鍵」
- 本人が秘密に保持する「秘密鍵」
という異なる鍵の組み合わせを利用します。
利用する方式・用途によって処理は異なりますが、公開鍵暗号は、
- 安全な鍵交換
- 暗号通信
- デジタル署名
など、現代の情報セキュリティで重要な役割を持っています。
共通鍵暗号と公開鍵暗号はどちらか一方だけを使うとは限らず、実際の通信システムでは複数の暗号技術を組み合わせることがあります。
「ハッシュ化」とは?
データから一定長の「ハッシュ値」を生成する
ハッシュ化とは、入力データを、
ハッシュ関数
へ入力し、
ハッシュ値
と呼ばれる値へ変換する処理です。
ハッシュ値は、
メッセージダイジェスト
ダイジェスト
などと呼ばれることもあります。
NISTは暗号学的ハッシュ関数について、任意長のビット列を固定長のビット列へ変換する関数と説明しています。
つまり、非常に短い文章でも巨大なファイルでも、同じハッシュアルゴリズムを使えば、基本的には決められた長さのハッシュ値が生成されます。
ハッシュ値は「データの指紋」のようなもの
NISTは、ハッシュ関数によって生成される値を、ファイルやメッセージを表す、
「fingerprint(指紋)」
のようなものとして説明する資料も公開しています。
元データが少し変わると、通常は異なるハッシュ値になります。
その性質を利用して、
「以前と同じデータか」
「途中で改ざんされていないか」
などを確認できます。
ハッシュ化したデータは「復号」できない
暗号化との最大の違いです。
暗号化されたデータには、正しい鍵を利用して元データへ戻す「復号」という操作があります。
しかし、通常の暗号学的ハッシュ関数は、
ハッシュ値から元データを復元するための逆変換を用意していません。
NISTも安全なハッシュ関数に求められる性質として、特定の出力から入力を求めることが計算上困難である、
一方向性・原像計算困難性
を挙げています。
そのため、
「ハッシュ値を復号する」
という表現は、通常は適切ではありません。
「復号できない」=元のパスワードが絶対に分からない?
ここは注意が必要です。
ハッシュ値には、暗号文のような「復号」はありません。
しかし、攻撃者が、
- 候補となるパスワードを推測する
- その候補を同じ方法でハッシュ化する
- 盗んだハッシュ値と一致するか比較する
という試行を大量に行えば、元の入力と同じ文字列を見つけられる可能性があります。
特に短いパスワード・よく使われるパスワードは推測されやすくなります。
したがって、
「ハッシュ化=どんなデータでも絶対に元が分からない」
と考えるのは正確ではありません。
「SHA-256」とは?
SHA-256は、代表的な暗号学的ハッシュ関数の一つです。
SHAは、
Secure Hash Algorithm
の略です。
NISTのSecure Hash Standard(FIPS 180-4)では、SHA-2ファミリーに属する複数のハッシュアルゴリズムが規定されています。
SHA-256では、入力の大きさにかかわらず、256ビットのハッシュ値を生成します。
ただし、
SHA-256=暗号化方式
ではありません。
SHA-256はハッシュ関数です。
SHA-3とは?
NISTはFIPS 202で、
- SHA3-224
- SHA3-256
- SHA3-384
- SHA3-512
などのSHA-3ファミリーも標準化しています。
SHA-3も暗号化して復号するための方式ではなく、暗号学的ハッシュ関数です。
暗号化とハッシュ化の決定的な違い
違い1:元に戻す必要があるか
暗号化=元データへ戻す必要がある情報に使う
ハッシュ化=元データへ戻すことを目的としない
という違いがあります。
たとえば、利用者の住所を後から画面に表示したいなら、必要に応じて復元できる方法が必要です。
一方、パスワード認証では、入力されたパスワードが登録時のものと一致するか確認できればよく、サービス側が元のパスワードを知る必要は通常ありません。
違い2:目的が違う
暗号化の主目的は、
機密性
です。
ハッシュ関数は、
- データの完全性確認
- デジタル署名
- 認証関連処理
- 鍵導出
など、さまざまな暗号技術の構成要素として利用されます。
違い3:鍵の扱いが違う
暗号化では通常、暗号鍵が必要です。
一方、SHA-256など一般的なハッシュ関数は、入力データからハッシュ値を計算する際に秘密の暗号鍵を必要としません。
ただし、HMACのように、ハッシュ関数と秘密鍵を組み合わせる別の仕組みもあります。
したがって、
「ハッシュ技術では絶対に鍵を使わない」
と一般化するのも適切ではありません。
違い4:出力の長さが違う
一般的な暗号化では、元データの大きさなどに応じて暗号文の長さも変化します。
一方、通常の暗号学的ハッシュ関数は、どれほど大きな入力でも、そのアルゴリズムで決められた長さのハッシュ値を出力します。
パスワードは「暗号化」ではなく「ハッシュ化」する?
パスワード保存では、非常に重要な違いになります。
OWASPは、一般的な認証用パスワードについて、
復号可能な暗号化ではなく、適切なパスワードハッシュ方式を利用して保存する
ことを推奨しています。
理由は、サービス自身が利用者の元パスワードを取り出す必要が通常ないためです。
ログイン時には、
- 利用者がパスワードを入力する
- 入力されたパスワードへ同じパスワードハッシュ処理を行う
- 保存されている値と比較する
- 一致すれば認証する
という方法を利用できます。
「パスワードをSHA-256でハッシュすれば安全」ではない
ここも重要です。
「パスワードはハッシュ化する」と聞くと、
SHA-256を1回かければよい
と思うかもしれません。
しかしOWASPは、SHA-256のように高速計算を目的とした一般的なハッシュ関数を、そのままパスワード保存へ使うことを推奨していません。
高速であるほど、攻撃者も大量のパスワード候補を短時間で試しやすいためです。
パスワード保存では、
- Argon2id
- scrypt
- bcrypt
- PBKDF2
など、パスワード保存を考慮した方式が利用されます。
どの方式を採用するかは、システム要件・標準・ライブラリ・法令等に応じて判断する必要があります。
「ソルト」とは?
パスワードハッシュで重要なのが、
ソルト(salt)
です。
ソルトは、パスワードごとに付加するランダムな値です。
たとえば2人の利用者が偶然まったく同じパスワードを設定したとしても、異なるソルトを利用すれば、保存されるハッシュ値を異なるものにできます。
これによって、あらかじめ大量のパスワードとハッシュ値の対応表を作って攻撃する手法への耐性を高められます。
OWASPも、パスワードごとに一意のソルトを使用することを重要な対策として説明しています。
ソルトは秘密にする必要がある?
一般的なパスワードハッシュ方式では、ソルト自体をパスワードのように秘密にしておくことは前提ではありません。
重要なのは、
利用者・パスワードごとに適切に異なるソルトを利用すること
です。
ソルトとは別に、システム側で秘密値を追加する、
「ペッパー(pepper)」
という考え方もあります。
「暗号化」と「エンコード」の違い
暗号化と混同されやすい言葉に、
エンコード(符号化)
があります。
エンコードは、データを別の表現形式へ変換する処理です。
たとえばBase64は、バイナリデータなどを文字列として扱いやすくするために使われる符号化方式です。
Base64には秘密鍵がなく、ルールを知っていれば誰でも元のデータへ戻せます。
したがって、
Base64=暗号化
ではありません。
| 処理 | 主な目的 | 元に戻せる? |
|---|---|---|
| 暗号化 | 秘密を守る | 正しい鍵で戻せる |
| ハッシュ化 | 要約・検証用の値を作る | 元に戻す処理を前提としない |
| エンコード | データ形式を変換する | 規則に従えば戻せる |
ハッシュ値はデータの改ざん検出に使える
ハッシュ関数の代表的な用途が、
データの完全性確認
です。
たとえばソフトウェア配布サイトで、ダウンロードファイルのSHA-256値が公開されている場合があります。
利用者がダウンロードしたファイルからSHA-256値を計算し、公式サイトの値と比較します。
同じなら、
「少なくともハッシュ値を比較した範囲では、配布元が示したデータと一致している」
と確認できます。
NISTのSecure Hash Standardも、生成されたメッセージダイジェストが、元データから変更されていないかを検出する用途で利用できると説明しています。
ハッシュ値が同じなら絶対に同じデータ?
数学的には、異なる入力から同じハッシュ値が生まれる可能性はあります。
これを、
「衝突(collision)」
といいます。
なぜなら、任意の長さの入力を有限個の固定長の値へ変換する以上、理論上は異なる入力が同じ出力になる組み合わせが存在するためです。
そのため安全な暗号学的ハッシュ関数には、
実用上、衝突を見つけることが計算的に困難であること
が求められます。
NISTも、安全なハッシュ関数の重要な性質として「衝突耐性」を挙げています。
MD5やSHA-1を使えばよい?
暗号学的用途では、古いハッシュアルゴリズムを無条件に利用するべきではありません。
アルゴリズムによって安全性が異なり、研究によって衝突攻撃などが現実化したものもあります。
IPAも過去の調査で、SHA-1の安全性低下を受けて新しい暗号学的ハッシュ関数の研究・標準化が進められてきたことを説明しています。
NISTもFIPS 180-4の今後の改訂ではSHA-1の仕様を削除する方針を示しています。
実際のシステムでは、最新の標準・ガイドラインに基づいてアルゴリズムを選択する必要があります。
ハッシュ化とデジタル署名の違い
ハッシュ化とデジタル署名も同じではありません。
デジタル署名では、暗号学的ハッシュ関数が構成要素として利用されることがあります。
たとえば元データからハッシュ値を作成し、その値などに公開鍵暗号技術を利用した署名処理を行います。
これによって、
- データが改ざんされていないか
- 誰が署名したか
などを検証する仕組みを構成できます。
IPAも、デジタル署名やPKIにおいて暗号学的ハッシュ関数が重要な役割を持つことを説明しています。
ハッシュ化とHMACの違い
HMACは、
Hash-based Message Authentication Code
の略です。
単純にデータをハッシュ化するだけでなく、
秘密鍵
を組み合わせてメッセージ認証コードを生成します。
そのため、一般的なハッシュ値だけの比較よりも、
「その秘密鍵を知る主体によって生成されたこと」
を確認する用途に利用できます。
ハッシュ関数を利用しますが、単純なハッシュ化とは目的・仕組みが異なります。
暗号化とハッシュ化を両方使うこともある
あります。
実際のセキュリティシステムでは、
- 暗号化
- ハッシュ関数
- デジタル署名
- メッセージ認証
- 鍵交換
など複数の暗号技術を組み合わせることがあります。
IPAも、現代のセキュアなプロトコルでは共通鍵暗号・公開鍵暗号・ハッシュ関数などが組み合わされて利用されることを説明しています。
したがって、
「暗号化とハッシュ化はどちらか一方を選ぶもの」
とは限りません。
暗号化したデータからハッシュ値を作ることもできる?
できます。
ハッシュ関数には任意のデータを入力できるため、暗号化されたデータを入力してハッシュ値を生成することも可能です。
ただし、
何を目的として暗号化・ハッシュ化するのか
によって適切な設計は変わります。
セキュリティシステムを設計する場合には、自己流で暗号方式を組み合わせるのではなく、標準化された方式・十分に検証されたライブラリを利用することが重要です。
「暗号化・ハッシュ化」で迷ったときの3秒判定
| こんな場合 | 答え |
|---|---|
| 後で元の文章を読みたい | 暗号化 |
| 正しい鍵で元へ戻す | 復号 |
| ファイルが改ざんされていないか比較したい | ハッシュ化 |
| SHA-256を使う | ハッシュ化 |
| AESを使ってデータを秘密にする | 暗号化 |
| 認証用パスワードを安全に保存する | パスワード保存向けのハッシュ方式 |
| Base64へ変換する | エンコード |
最も簡単に覚えるなら、
暗号化=「秘密にして、鍵で戻す」
ハッシュ化=「指紋を作って比較する」
です。
「暗号化」を使った例文
- 重要なファイルを暗号化して保存する。
- 通信内容を暗号化して第三者による盗み見を防ぐ。
- AESを利用してデータを暗号化する。
- 暗号化したデータを正しい鍵で復号する。
- ノートパソコンのストレージを暗号化する。
「ハッシュ化」を使った例文
- ファイルをハッシュ化してハッシュ値を計算する。
- ダウンロードしたファイルのハッシュ値を比較する。
- パスワード保存向けの方式でパスワードをハッシュ化する。
- デジタル署名の処理にハッシュ関数を利用する。
- SHA-256でファイルのハッシュ値を求める。
具体例で比較:秘密の文書
会社の機密文書があり、許可された社員だけが内容を読む必要があるとします。
この場合、文書を読めない状態へ変換し、権限を持つ人が適切な鍵を使って元の内容を読める必要があります。
したがって使われる考え方は、
暗号化
です。
ハッシュ化してしまうと、元の文書そのものを取得する用途には使えません。
具体例で比較:ダウンロードファイル
ソフトウェアをダウンロードしたとき、配布元がSHA-256値を公開しているとします。
利用者は、自分がダウンロードしたファイルからSHA-256値を計算します。
そして、配布元の値と比較します。
目的はファイルの中身を秘密にすることではなく、
「同じデータか」「変更されていないか」を確認すること
なので、これはハッシュ関数の用途です。
具体例で比較:Webサービスのパスワード
Webサービスのログイン用パスワードでは、サービス運営者が元のパスワードを読む必要は通常ありません。
必要なのは、ログイン時に入力された値が、登録時のものと一致しているか確認することです。
そのためOWASPは、認証用パスワードを復号可能な暗号化ではなく、適切なパスワードハッシュ方式で保存するよう推奨しています。
よくある間違い1:「暗号化」と「ハッシュ化」は同じだと思う
違います。
暗号化は正しい鍵で復号することを前提とします。
ハッシュ化は元データへ戻すことを目的としません。
よくある間違い2:「ハッシュ値を復号すれば元データに戻る」と思う
通常の暗号学的ハッシュ関数には、暗号化のような復号処理はありません。
ただし、候補を総当たりして一致する入力を探す攻撃などはあり得ます。
よくある間違い3:「SHA-256は暗号化方式」だと思う
SHA-256は暗号化方式ではなく、暗号学的ハッシュ関数です。
AESなどの暗号方式とは目的・性質が異なります。
よくある間違い4:「パスワードはAESで暗号化すれば十分」と思う
一般的なログイン認証用パスワードは、後から元の文字列を取り出す必要がありません。
OWASPは、原則として復号可能な暗号化ではなく、パスワード保存向けのハッシュ方式を利用するよう推奨しています。
よくある間違い5:「SHA-256を1回使えば安全なパスワード保存になる」と思う
一般的な高速ハッシュ関数をそのまま使うだけでは、大量のパスワード候補を高速に試されやすくなります。
パスワード保存ではArgon2idなど、目的に適した方式を使用することが重要です。
よくある間違い6:「Base64は暗号化」だと思う
Base64はデータの表現形式を変換するエンコード方式です。
秘密鍵を知らなければ戻せない暗号化とは異なります。
よくある間違い7:「ハッシュ値が公開されていると危険」と思う
ファイルの完全性確認などでは、ハッシュ値を公開して比較できるようにすることがあります。
ハッシュ値の用途によって、公開して問題があるかどうかは異なります。
パスワードハッシュについては、攻撃者に取得されるとオフラインで推測攻撃を受ける可能性があるため、安全な方式・ソルト・適切なパラメータなどが重要です。
「暗号化」と「ハッシュ化」に関するよくある質問
Q1. 「暗号化」と「ハッシュ化」の一番簡単な違いは?
暗号化は正しい鍵で元に戻せる処理、ハッシュ化は元データから検証・識別用の値を作る一方向の処理です。
Q2. ハッシュ化したデータは復号できますか?
通常の意味で復号はできません。
ハッシュ関数には、暗号化のような逆変換用の鍵が存在しないためです。
ただし、入力候補を大量に試して一致する値を探すことは可能なので、単純なパスワードなどでは注意が必要です。
Q3. AESは暗号化ですか?
はい。
AESはNISTが標準化している共通鍵ブロック暗号です。
Q4. SHA-256は暗号化ですか?
いいえ。
SHA-256は暗号学的ハッシュ関数です。
Q5. パスワードは暗号化とハッシュ化のどちらで保存しますか?
一般的な認証用パスワードでは、復号可能な暗号化より、パスワード保存向けの安全なハッシュ方式を利用することが推奨されます。
OWASPは新規システムではArgon2idを優先候補として挙げています。
Q6. ハッシュ化すれば個人情報を安全に保存できますか?
用途によります。
住所・氏名など、後から元データを表示する必要がある情報は、単純にハッシュ化すると元へ戻せません。
機密性を守りながら元データを利用する必要がある場合は、適切な暗号化等を検討します。
Q7. ハッシュ値は必ず一意ですか?
数学的には異なるデータが同じハッシュ値になる「衝突」があり得ます。
安全な暗号学的ハッシュ関数では、実用上その衝突を見つけることが極めて困難であることが重要です。
Q8. 同じデータなら同じハッシュ値になりますか?
通常の決定的なハッシュ関数に同じデータを同じ条件で入力すれば、同じハッシュ値になります。
ただし、パスワード保存のようにソルトを組み合わせる場合には、同じパスワードでも異なるソルトによって保存値が異なります。
Q9. 暗号化とハッシュ化を同時に使うことはありますか?
はい。
現実のセキュリティシステムでは、暗号化、ハッシュ関数、デジタル署名、メッセージ認証など複数技術を組み合わせることがあります。
Q10. 迷ったときの簡単な見分け方は?
「あとで元の情報を読む必要がある?」 → 暗号化
「元の情報を戻さず、一致・改ざんなどを確認したい?」 → ハッシュ化
と考えてください。
まとめ
「暗号化」と「ハッシュ化」は、どちらも元データとは異なる見た目の値を作るため混同されやすい技術ですが、目的も仕組みも異なります。
| 暗号化 | ハッシュ化 |
|---|---|
| 内容を秘密にする | データの要約値を作る |
| 鍵を使って復号できる | 復号を前提としない |
| 暗号文を生成する | ハッシュ値を生成する |
| AESなど | SHA-256、SHA-3など |
| 機密性の確保などに使う | 完全性確認・署名・認証関連などに使う |
最も簡単な覚え方は、
暗号化=「秘密にして、必要なら鍵で元に戻す」
ハッシュ化=「元データから指紋のような値を作る」
です。
たとえば重要な文書を後から読みたいなら、暗号化して、権限のある人が復号できるようにします。
一方、ファイルが改ざんされていないか確認したいなら、ハッシュ値を計算して比較できます。
パスワード保存についても、
「あとで元のパスワードを表示する必要がない」
ため、一般的な認証システムでは復号可能な暗号化よりも、パスワード保存向けのハッシュ方式が重要になります。
ただし、
「SHA-256を1回使えば安全」
という単純な話ではありません。
パスワード保存では、Argon2idなど用途に適した方式、ソルト、適切な計算コストなどを組み合わせて設計する必要があります。
さらに、
暗号化=機密性
ハッシュ関数=完全性確認など
と役割を分けて考えると、両者を理解しやすくなります。
現代の情報セキュリティでは、暗号化とハッシュ化のどちらか一方だけではなく、複数の暗号技術を適切に組み合わせて利用することが一般的です。
参考リンク・出典
-
NIST「FIPS 197: Advanced Encryption Standard (AES)」
― AESを共通鍵ブロック暗号として規定。暗号化によってデータの機密性を保護し、AES-128・AES-192・AES-256を定義 -
NIST CSRC Glossary「Hash function」
― 暗号学的ハッシュ関数を、任意長の入力から固定長の出力を生成し、一方向性や衝突耐性などを持つ関数として説明 -
NIST「FIPS 180-4: Secure Hash Standard」
― SHA-2系などのセキュアハッシュアルゴリズムと、メッセージダイジェストによるデータ変更検出について規定 -
NIST「FIPS 202: SHA-3 Standard」
― SHA3-224、SHA3-256、SHA3-384、SHA3-512などSHA-3ファミリーを規定 -
OWASP「Password Storage Cheat Sheet」
― パスワードは平文・復号可能な暗号化ではなく、Argon2idなどのパスワード保存向け方式で保護すること、ソルトやペッパー等について解説 -
OWASP「Cryptographic Storage Cheat Sheet」
― 保存データの暗号化、鍵管理、パスワードを復号可能な暗号化で保存すべきでないことなどを解説 -
IPA「承認されたセキュリティ機能」
― 暗号化機能・ハッシュ機能・署名機能等を異なるセキュリティ機能として整理し、各種暗号アルゴリズムを掲載 -
IPA「『ハッシュ関数安全性評価手法の開発』に関する報告書」
― 暗号学的ハッシュ関数の性質、デジタル署名との関係、ハッシュ値から元データを探すことが困難である性質などを解説
※本記事では一般ユーザー向けに、「暗号化=適切な鍵によって復号可能な変換」「ハッシュ化=暗号学的ハッシュ関数によってハッシュ値を生成する一方向の処理」と整理しています。
※「ハッシュ化した値から元データへ戻せない」とは、暗号化のような復号アルゴリズムが存在しないという意味です。入力候補を推測してハッシュ値を比較する攻撃まで不可能という意味ではありません。
※認証用パスワードの保存では、SHA-256などの高速な汎用ハッシュ関数を単純に1回適用するだけでは十分ではありません。システム開発では最新のセキュリティガイドラインと、十分に検証されたパスワードハッシュライブラリを利用してください。
※暗号アルゴリズムの安全性は時代とともに変化します。実際のシステムでアルゴリズムを選択する場合には、NIST、CRYPTREC、IPA等の最新情報を確認してください。
※本記事は暗号技術の基本概念を理解するための一般的な解説であり、個別システムの暗号設計・安全性を保証するものではありません。
