用語辞典・データ・文字コード

SHA-256

SHA-256とは

SHA-256(Secure Hash Algorithm 256-bit/セキュア・ハッシュ・アルゴリズム・トゥーハンドレッド・フィフティシックス・ビット/シャー・ニゴロ)は、256ビットのハッシュ値を出力するSHA-2ファミリーの暗号学的ハッシュ関数です。

任意長のメッセージをパディングして512ビットブロックへ分け、各ブロックを順に圧縮関数へ通します。最後の内部状態八語を連結した32バイトがダイジェストです。

名前の256は入力長やブロック長ではなく、出力ダイジェストのビット数です。ブロックは512ビットで、内部計算は32ビット語を単位に行います。

メッセージへパディングと長さを加え、512ビットブロックへ分ける八つの状態を64ラウンドずつ更新し、256ビットダイジェストへする
文書へ開始マーカー・パディング・長さを加えて等しいブロックに分け、八色の状態を多数ラウンドの混合器でブロックごとに更新し、八グループの固定長指紋へする流れ、微小変更の雪崩、認証済みハッシュ照合、単純鍵連結とHMAC、パスワード用低速導出を示すピクトグラム図解
図1各ブロックは前の状態を受け継ぐため、途中の一ビット変更が後続の全計算へ伝わります。

SHA-256の処理段階

パディング1ビットと0ビットを補う

末尾へ1を置き、長さフィールドの直前まで0で埋めます。

長さ元のビット長を加える

メッセージ長を64ビットビッグエンディアン値として最後へ置きます。

Blocks512ビットずつ処理する

一ブロックを16個の32ビット語として読み、予定を64語へ広げます。

Rounds八つの作業値を混ぜる

ローテート、シフト、XOR、選択、多数決、加算を64ラウンド行います。

Chaining状態へ加える

ブロック処理後の作業値を前状態へ加え、次ブロックへ渡します。

ダイジェスト256ビットを出力する

最後の八つの32ビット状態を順に連結します。

パディングは曖昧な終端をなくす

メッセージの後ろへビット 1、必要な個数の0、元メッセージ長の64ビット表現を加えます。全体は512ビットの倍数になります。元メッセージ長は2の64乗ビット未満です。

バイト列APIではパディングをライブラリーが行います。利用者がテキストへ文字10を追記する処理ではありません。テキストなら先にUTF-8等のバイト列を確定します。

メッセージ予定と64ラウンド

各512ビットブロックの先頭16語をビッグエンディアンで読み、ローテートとシフトを使う式で64語のメッセージ予定へ広げます。固定の64個のラウンド一定と共に圧縮関数へ入れます。

八つの32ビット作業変数は、選択・多数決、複数のローテート/XOR、2の32乗を法とする加算で更新されます。暗号化のラウンドに似た反復構造でも、復号してメッセージへ戻す鍵はありません。

32バイト・64桁の16進表記

ダイジェストは256ビット=32バイトです。人が扱うときは一バイトを二桁にする16進数で64桁表示することが一般的です。16進文字列はダイジェストバイトそのものではなく、その表示表現です。

大文字・小文字、空白、接頭辞を除いて同じバイトか確認します。アルゴリズム名なしで64桁だけ保存すると、別アルゴリズム・別符号化との取り違えが起きます。

同じ入力と一ビット違う入力

同じバイト列なら必ず同じダイジェストです。一ビットの変更でも各ラウンドを通じて差が広がり、出力ビットがおおむね広く変わります。この雪崩効果により、似たファイル同士のハッシュ値は似ません。

ハッシュから「どの部分が変わったか」は分かりません。差分調査にはファイル比較、チャンクハッシュ、バージョン制御等を使います。

ファイルの完全性確認

ダウンロード後にSHA-256を計算し、ソフトウェア提供者が署名済みページや別通信路で公開した値と照合します。値を同じ改ざん可能な場所から取るだけでは、ファイルとダイジェストを同時に置換されます。

計算対象が圧縮ファイルか展開後ファイルか、行改行形式やメタデータを含むかを一致させます。「見た目が同じ文書」ではなく完全に同じバイト列が対象です。

単純な鍵前置きと長さ拡張攻撃

SHA-256はMerkle–Damgård構造のため、SHA256(secret || message)のダイジェストとメッセージ長を知る相手が、秘密情報を知らずにパディング後へデータを追加したダイジェストを計算できる長さ拡張攻撃問題があります。

メッセージ認証には独自の連結式ではなく、規定されたHMAC-SHA-256を使います。HMACは内側・外側の二段ハッシュと異なる埋め草でこの問題を避けます。

パスワード保存には速すぎる

SHA-256は高速・省メモリーで大量データを処理する設計です。その性質はファイル照合には長所ですが、パスワード候補の総当たりも高速にします。

パスワードには利用者ごとのソルトと、Argon2id等のコスト調整可能なパスワード用KDFを使います。SHA-256を何となく複数回繰り返す独自方式にしません。

SHA-256はパディング済みメッセージを512ビットブロックで連鎖処理し、256ビットダイジェストを作るSHA-2のハッシュです。バイト表現、完全性値の入手経路、HMAC、パスワード用KDFとの境界を守ります。

padding・block・schedule・round・digest:NIST FIPS 180-4 Secure Hash Standard

関連用語