SHA-256とは
SHA-256(Secure Hash Algorithm 256-bit/セキュア・ハッシュ・アルゴリズム・トゥーハンドレッド・フィフティシックス・ビット/シャー・ニゴロ)は、256ビットのハッシュ値を出力するSHA-2ファミリーの暗号学的ハッシュ関数です。
任意長のメッセージをパディングして512ビットブロックへ分け、各ブロックを順に圧縮関数へ通します。最後の内部状態八語を連結した32バイトがダイジェストです。
名前の256は入力長やブロック長ではなく、出力ダイジェストのビット数です。ブロックは512ビットで、内部計算は32ビット語を単位に行います。

SHA-256の処理段階
末尾へ1を置き、長さフィールドの直前まで0で埋めます。
メッセージ長を64ビットビッグエンディアン値として最後へ置きます。
一ブロックを16個の32ビット語として読み、予定を64語へ広げます。
ローテート、シフト、XOR、選択、多数決、加算を64ラウンド行います。
ブロック処理後の作業値を前状態へ加え、次ブロックへ渡します。
最後の八つの32ビット状態を順に連結します。
パディングは曖昧な終端をなくす
メッセージの後ろへビット 1、必要な個数の0、元メッセージ長の64ビット表現を加えます。全体は512ビットの倍数になります。元メッセージ長は2の64乗ビット未満です。
バイト列APIではパディングをライブラリーが行います。利用者がテキストへ文字1や0を追記する処理ではありません。テキストなら先に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