順番に読み進めながら学べます

hashlib — データのハッシュ値を計算する

hashlib.sha256の64文字ハッシュ、決定性・雪崩効果・一方向性の3性質、改ざん検出、パスワード保存にbcrypt/argon2を使う理由を実例で学べます。

hashlib任意のバイト列から固定長のハッシュ値を計算する標準ライブラリです。代表的なSHA-256256 ビット = 64 文字の 16 進文字列を返し、ファイル整合性チェック・API 署名・Git のコミット IDなど「中身が同じか確認したい」場面で広く使われています。

picklebase64と違って、hashlib は出力から元の入力を復元できない一方通行の変換です。「保存・復元」用途ではなく、「同じか違うかだけ判定したい」用途に使う、という違いを押さえておきましょう。

pickle / base64 と hashlib の違い
pickle / base64双方向変換オブジェクト ⇄ bytesbytes ⇄ ASCII保存・復元できるhashlib一方向変換bytes → ハッシュ戻せない同じか違うかを判定用途用途
pickle / base64戻せる双方向の変換で「保存・復元」「経路変換」に使う。hashlib戻せない一方向の変換で、入力同士が同じか・違うかだけを判定したい場面に使う。用途が根本的に違うため、混同せず使い分ける。

SHA-256 — 64 文字の 16 進ハッシュと 3 つの性質

hashlib の典型 4 用途
ファイル整合性確認sha256sum の比較Git のコミット IDツリー全体のハッシュキャッシュキー生成入力ハッシュをキーAPI 署名 (HMAC)リクエスト改ざん防止
ファイルダウンロードの整合性確認 / Git のコミット ID / キャッシュキーの生成 / API リクエストの署名(HMAC)。共通点は、「中身が同じか」を固定長のハッシュ値で判断すること — 戻せないので保存の代わりにはならない。
ハッシュ関数の 3 つの性質
入力 ASHA-256ハッシュ X(64 文字 hex)入力 A (再度)SHA-256ハッシュ X(必ず同じ)入力 A' (1 文字違い)SHA-256ハッシュ Y(全く違う)
決定性(同じ入力 → 同じ出力)、雪崩効果(1 ビット違いで全然違う出力)、一方向性(出力から入力を復元できない)。SHA-256 は出力が常に 64 文字の 16 進文字列で、改ざん検出や整合性チェックに使われる。
メソッド / アルゴリズムビット長用途
hashlib.sha256(b)256 bit (64 hex 文字)ファイル整合性・API 署名(推奨)
hashlib.sha512(b)512 bit (128 hex 文字)より長いハッシュ値が要るとき
hashlib.md5(b)128 bit (32 hex 文字)衝突攻撃あり、新規には使わない
.hexdigest()16 進文字列で取り出す
.digest()生バイト列で取り出す

パスワード保存に hashlib だけは使わない

ユーザーパスワードをsha256 のような単純なハッシュで保存するだけだと、事前計算(レインボーテーブル)で逆引きされる可能性があります。ソルト + ストレッチングを組み込んだbcrypt / argon2 / passlibなどの専用ライブラリを使って対策できます。hashlibはファイル整合性チェックや API 署名のような「同じ入力か確認したい」用途に向きます。

"Hello, Python!" の SHA-256 を計算し、出力が常に 64 文字の 16 進文字列であることを確認します

① hashlib を読み込み、文字列"Hello, Python!"UTF-8 で bytes に変換してください

② そのバイト列の SHA-256 をhashlib.sha256(...).hexdigest()16 進文字列として取得してください

③ ハッシュの長さSHA-256 長: ◯の形で表示してください(64 になるはず)

Python エディタ

コードを実行してください

決定性と雪崩効果を確かめる

ハッシュ関数の特徴のうち、「同じ入力なら同じ出力」(決定性)と「1 文字違うだけで全然違う出力」(雪崩効果)を、2 種類の入力を比較することで確認します。この 2 つが成り立つから、ファイル整合性チェックや改ざん検出に使えます。

実践 1 で計算したハッシュと、もう一度計算した値・末尾を変えた値とを比較します

① 実践 1 と同じ手順で"Hello, Python!"の SHA-256 をshaに入れてください

同じ入力をもう一度ハッシュ化し、shaと一致するかを再計算で一致: True / Falseの形で表示してください

末尾の ! を . に変えたバイト列のハッシュを計算し、sha異なることを1 文字変えると違う: True / Falseの形で表示してください

Python エディタ

コードを実行してください
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1SHA-256 のhexdigest()が返す文字列の長さはどれですか?

Q2同じ入力から計算した SHA-256はどうなりますか?

Q3ハッシュ値から元の入力を復元することはできますか?

Q4ユーザーパスワードを保存するとき、最も適切な選択肢はどれですか?