# SHA-256とは一体何なのか

> Cuadernos Lacre · コンセプト · 2026年5月19日
> https://solo2.net/ja/notebooks/articulos/what-sha-256-actually-is.html

64文字に収まる数学的な指紋。元のテキストのコンマ一つが動くだけで、そのすべてが変化します。なぜデジタル封蝋（ふうろう）と呼ばれるのか。

---

## テクニカルな名前の背後にあるシンプルなアイデア

スロットが一つ、画面が一つしかない機械を想像してみてください。スロットにテキストを入れます。それは単語、フレーズ、あるいは小説一冊かもしれません。すると画面に、正確に64文字の数列が表示されます。専門家はこの数列を「ハッシュ」または「暗号学的要約」と呼びますが、一般の方は、指紋が人のものであるように、テキストの「数学的な指紋」と呼んでいいでしょう。

同じテキストを2回入力すれば、機械は2回とも同じ指紋を表示します。もしテキストをわずかでも変えれば（コンマ一つを動かしたり、大文字を小文字にしたり）、機械は最初とは全く異なる指紋を表示します。似ているのではなく、完全に別物です。この2つの性質（決定性と感度）こそがシンプルなアイデアの正体です。SHA-256のそれ以外は、これらを確実に機能させるための仕組みに過ぎません。

まず、この機械が「しないこと」を明確にしておきましょう。テキストを暗号化（隠匿）はしません。保存もしません。機械はテキストを見て、指紋を計算し、テキストのことは忘れます。指紋から元のテキストを復元することは不可能です。できるのは、あるテキストが元のものと一致するかどうかを確認することだけです。そのため、これを「一方通行」の要約と呼びます。行くことはできても、戻ることはできません。

## ハッシュと暗号化は別物

よく混同されますが、暗号化とハッシュ化は全く別の操作です。暗号化とは、鍵を持つ者だけが元の形に戻せるようにテキストを変換することです。ハッシュ化とは、鍵があろうとなかろうと、元のテキストを二度と復元できない指紋を生成することです。前者は設計上「可逆的」であり、後者は設計上「不可逆的」です。

この違いには実用的な意味があります。あるアプリが「パスワードを暗号化して保存しています」と言う場合、誰か（そのアプリ自体など）がそれを復号する鍵を持っています。しかし、アプリが「パスワードをハッシュ化して保存しています」と言う場合、アプリ側も元のパスワードを知ることはできません。あなたが入力したパスワードが、保存されている指紋と同じものを生成するかどうかを確認できるだけです。適切に行われれば、後者の方がパスワード保存において遥かに優れています。「適切に」というのがSHA-256単体以上のものを必要とする理由は、後ほど説明します。

## 暗号学的ハッシュを支える4つの性質

「暗号学的」ハッシュ関数と呼ばれるためには、以下の4つの性質を満たす必要があります：

1. 決定性：同じ入力からは常に同じ指紋が生成される。
2. 雪崩効果：入力のわずかな変化が、以前のものとは似ても似つかない全く異なる指紋を生成する。
3. 逆像耐性：指紋から元のテキストを見つけ出すことは計算上不可能である。
4. 衝突耐性：同じ指紋を生成する2つの異なるテキストを見つけ出すことは計算上不可能である。

「計算上不可能」とは、「数学的に不可能」という意味ではありません。それを達成するために必要な時間、エネルギー、コストが、利用可能な全計算能力の桁を遥かに超えていることを意味します。SHA-256の場合、その限界は、専用ハードウェアを用いた最も楽観的な見積もりでも数千兆年単位です。つまり、読者の皆さんにとっては実質的に「不可能」と同じことです。

## 具体的にはSHA-256とは

名前がすべてを物語っています。SHAは「Secure Hash Algorithm（安全なハッシュアルゴリズム）」の略です。256という数字は指紋のサイズが256ビットであることを示しています。これは32バイトであり、16進数で表示するとお馴染みの64文字になります。この規格は、2001年に米国のNIST（国立標準技術研究所）によってSHA-2ファミリーの一部として公開されました。現在の現行規格であるFIPS 180-4は2015年のものです。

その規模を想像してみてください。256ビットでは、2の256乗通りの値が可能です。これは10進数で78桁の数字であり、観測可能な宇宙にある原子の推定数よりも数桁大きいです。世界中のあらゆるテキストが、これらの値のいずれかに割り当てられます。2つの異なるテキストが偶然一致する確率は、実質的にゼロと見なせます。

## コードでの見え方

## なぜ「封蝋（ふうろう）」と呼ぶのか

15世紀から19世紀のヨーロッパの通信では、封蝋が手紙を封じていました。溶けた蝋を垂らし、その上に印章（シール）を押し当てることで、手紙に複製不可能な印が刻まれました。これは覗き見を防ぐものではありませんでしたが（紙は透かして読め、蝋は壊せた）、改ざんの証拠にはなりました。封印が少しでも乱れていれば、受取人は手紙を開く前に異変に気づけました。封蝋は被害を防ぐのではなく、それを「宣言」したのです。

各Cuadernoの本文のSHA-256は、デジタル版の同じ役割を果たします。記事が公開された瞬間からあなたが読むまでの間に、一文字でも変わっていれば、末尾の指紋は目の前にあるテキストのSHA-256とは一致しなくなります。5行のコードを書ける読者なら誰でもそれを検証できます。発行者は、指紋に露見することなく歴史を書き換えることはできません。これは被害を防ぐのではなく、それを「検証可能」にするのです。

## ハッシュが「しない」こと

SHA-256に期待されがちですが、本来の役割ではない4つのケースがあります：

1. 暗号化：ハッシュは要約であり、隠匿ではありません。テキストを読ませたくない場合は、ハッシュ化ではなく暗号化が必要です。
2. 著者の認証：ハッシュは誰が書いたかは教えず、どのテキストがハッシュ化されたかだけを教えます。著者を結びつけるには、ハッシュ単体ではなく、その上に暗号署名が必要です。
3. パスワードの保存：ここには罠があります。SHA-256は非常に高速に設計されています。これは多くの場合メリットですが、パスワード保存にはデメリットです。攻撃者は専用ハードウェアを使い、1秒間に数十億のパスワードを試して、あなたのハッシュに一致するものを見つけ出せてしまいます。パスワード保存には、Argon2、scrypt、bcryptなどの意図的に遅い鍵導出関数を、ソルト（ユーザーごとの固有のランダムデータ）と組み合わせて使うべきです。
4. 著者の識別子としてのハッシュ：ハッシュは著者を識別しません。内容を識別します。もし二人の人が同じ「hola」という言葉をハッシュ化すれば、二人とも同じ結果を得ます。これは中心的な性質であり、欠陥ではありません。もし結果が異なれば、公開されたものと受信したものが一致するか確認できなくなってしまいます。

## 日常生活の中のSHA-256

目には見えませんが、SHA-256はインターネットの日常を支えています。ビットコインのブロックチェーンは、各ブロックを次のブロックにSHA-256で繋ぐことで構築されています。過去のブロックを改ざんするには、それ以降のすべてのチェーンを再計算する必要があります。Git（世界中のコード管理システム）は、各コミットをその内容全体のハッシュ（最近はSHA-256、以前はSHA-1）で識別します。ウェブサイトのHTTPS証明書にもSHA-256が関連付けられています。ソフトウェアのダウンロード時には、ファイルが途中で改ざんされていないか確認できるように、開発者がSHA-256を公開していることがよくあります。そしてもちろん、各Cuaderno Lacreの末尾にも。

## プロフェッショナルな読者のために

システムを決定または監査する人のための4つの運用上の注意点：

1. ハッシュは暗号化ではありません。もしベンダーが技術文書でこの二つを混同していたら、正確にはどういう意味か問い質すべきです。
2. パスワード保存にSHA-256単体を使ってはいけません。前述の通り、この用途には速すぎます。現在の標準は Argon2id です。意図的に遅く、サーバーの能力に合わせて調整可能で、ユーザーごとのランダムなソルトと組み合わせます。
3. 契約書やファイルなどの文書の完全性（インテグリティ）には、SHA-256が依然として参照基準です。EUの認定タイムスタンプでも使用されています。
4. 数十年単位の長期保存には、SHA-256に加えてSHA-3やSHA-512も計算してアーカイブしておくのが賢明です。100年単位のアーカイブでは、単一の関数のみに依存しないのが暗号学的な慎重さです。

世界で最も精巧なドミノ倒しの回路を組み立てたと想像してみてください。何千もの駒、数十の分岐、機械的なブリッジ、そして部屋中を横切るスロープ。それらすべてが、一つ一つ慎重に配置されています。

最初の駒を軽く叩くと、連鎖は正確で再現可能な順序で倒れていきます。同じ配置、同じ最初の衝撃 → 何度繰り返しても、倒れた駒の最終的なパターンは同一になります。

ここが面白いところです。始める前に、たった一つの駒を横に5ミリ動かしてから、もう一度叩いてみてください。作動するはずのスロープは動かず、ブリッジは倒れず、別の分岐が作動します。床に残された駒の最終的なパターンは、最初のものとは全く見分けがつかないものになります。

SHA-256は数学的にこの回路です。あなたが書くテキストは駒の初期位置です。アルゴリズムは、連鎖を解き放つ衝撃です。そして最終的な結果（私たちが*ハッシュ*と呼ぶもの）は、すべてが停止した瞬間の床の静止画です。元のテキストのコンマ一つを変えるだけで、その写真は劇的に異なります。それほど単純で、それほど劇的なのです。

---

*この記事の末尾に戻ると、64文字の16進数の印が見えるはずです。それは、あなたが今読んだこの言語のテキストのSHA-256です。もし記事を翻訳すれば、印は変わります。スペイン語版の一文字を変えれば、スペイン語版の印も変わります。印は内容を保護するものではありませんが（それには別のツールがあります）、内容を一意に識別します。控えめに聞こえるかもしれませんが、それだけで、編集チェーンのどの段階でも、気づかれずに内容を書き換えることができなくなります。暗号化、署名、識別といった他のすべては、このシンプルなアイデアの上に構築されています。*

## 参考文献および関連資料

- NIST — *FIPS PUB 180-4: Secure Hash Standard (SHS)*, 2015年8月。SHA-256を含むSHA-2ファミリーの公式仕様。
- RFC 6234 — *US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)*, IETF, 2011年5月。実装者のための規範的バージョン。
- Ferguson, N.; Schneier, B.; Kohno, T. — *Cryptography Engineering: Design Principles and Practical Applications* (Wiley, 2010). 第5章と第6章でハッシュ関数とその正当・不当な使用法を扱っています。
- Nakamoto, S. — Bitcoin: A Peer-to-Peer Electronic Cash System (2008). 構造的に不変なチェーンを作るためにSHA-256を使用した実践的な例。
- 規則 (EU) 910/2014 (eIDAS) — 認定タイムスタンプの枠組み。SHA-256はEUで発行される認定電子署名およびシールの参照関数です。
- Zigでの参照実装：公式リポジトリの std.crypto.hash.sha2.Sha256 (*github.com/ziglang/zig* → lib/std/crypto/sha2.zig)。Solo2が実際に使用している、最適化され監査されたバージョンです。付録の教育用実装との比較に役立ちます。

---

*Cuadernos Lacre · Menzuri Gestión S.L. による刊行物 · 著者：R.Eugenio · 編集：Solo2 チーム*
*https://solo2.net/ja/notebooks/*
