Python hashlibとは?sha256・hexdigest・updateの使い方を初心者向けに解説

Pythonでハッシュ値を計算するときに使われる標準ライブラリがhashlibです。

hashlibを使うと、文字列やファイルなどのデータからSHA-256やSHA-512、SHA-3、BLAKE2などのハッシュ値を簡単に計算できます。パスワードそのものを保存せずに管理したり、ファイルの改ざんチェックをしたり、データの同一性を確認したりする場面で利用されます。(Python documentation)

この記事では、Pythonのhashlibについて、基本的な使い方からsha256()、hexdigest()、update()、ファイルのハッシュ化まで初心者向けに解説します。

hashlibとは?

hashlibは、Pythonに標準で用意されているハッシュ関数を扱うためのライブラリです。

import hashlib

ハッシュ関数とは、入力されたデータから一定の規則でハッシュ値と呼ばれる値を生成する関数です。

例えば、文字列"Python"をSHA-256でハッシュ化すると、次のような値になります。

18885f27b5afc6e8...

同じデータからは基本的に同じハッシュ値が生成されるため、データの比較や改ざん検知などに利用できます。

Pythonのhashlibでは、SHA-2、SHA-3、SHAKE、BLAKE2など、複数のハッシュアルゴリズムを利用できます。(Python documentation)


hashlibを使う基本的な方法

まずhashlibをインポートします。

import hashlib

次に、sha256()を使ってハッシュオブジェクトを作成します。

import hashlib

h = hashlib.sha256()

そしてupdate()でデータを渡します。

import hashlib

h = hashlib.sha256()
h.update(b"Python")

最後にhexdigest()を使うと、ハッシュ値を16進数の文字列として取得できます。

import hashlib

h = hashlib.sha256()
h.update(b"Python")

print(h.hexdigest())

hashlibは基本的に文字列ではなくバイト列を処理するため、b"Python"のようにbytesとして渡します。(Python documentation)


hashlib.sha256()とは?

sha256()は、SHA-256というハッシュアルゴリズムを利用するための関数です。

import hashlib

result = hashlib.sha256(b"Python").hexdigest()

print(result)

SHA-256では256ビットのハッシュ値が生成されます。

16進数で表示すると64文字になります。

import hashlib

text = "Python"
result = hashlib.sha256(text.encode()).hexdigest()

print(result)
print(len(result))

実行結果は次のようになります。

18885f27b5afc6e8...
64

日本語などの文字列を扱う場合も、encode()でバイト列に変換してからハッシュ化します。

import hashlib

text = "こんにちは"

result = hashlib.sha256(text.encode("utf-8")).hexdigest()

print(result)

hexdigest()とは?

hexdigest()は、ハッシュ値を16進数の文字列として取得するメソッドです。

import hashlib

h = hashlib.sha256(b"Python")

print(h.hexdigest())

一方、digest()を使うとバイト列として取得できます。

import hashlib

h = hashlib.sha256(b"Python")

print(h.digest())

通常、ハッシュ値を画面に表示したり、データベースなどで文字列として扱ったりするときにはhexdigest()が便利です。Python公式ドキュメントでも、hexdigest()は16進数の文字列を返すメソッドとして説明されています。(Python documentation)


update()とは?

update()は、ハッシュオブジェクトにデータを追加するメソッドです。

import hashlib

h = hashlib.sha256()

h.update(b"Hello")
h.update(b" ")
h.update(b"Python")

print(h.hexdigest())

複数回update()を呼び出すことができます。

h.update(b"Hello")
h.update(b" ")
h.update(b"Python")

これは、次のようにまとめて渡した場合と同じ結果になります。

h.update(b"Hello Python")

大量のデータを少しずつ読み込みながらハッシュ化するときにもupdate()が利用できます。(Python documentation)


hashlibでよく使われるハッシュアルゴリズム

hashlibではさまざまなハッシュアルゴリズムを利用できます。

代表的なものは次のとおりです。

関数 ハッシュアルゴリズム
hashlib.md5() MD5
hashlib.sha1() SHA-1
hashlib.sha224() SHA-224
hashlib.sha256() SHA-256
hashlib.sha384() SHA-384
hashlib.sha512() SHA-512
hashlib.sha3_256() SHA3-256
hashlib.sha3_512() SHA3-512
hashlib.blake2b() BLAKE2b
hashlib.blake2s() BLAKE2s

Pythonのバージョンによって利用できるアルゴリズムには違いがありますが、主要なアルゴリズムはhashlibから利用できます。(Python documentation)


SHA-256を使う

現在のPythonプログラミングでハッシュ値を扱う例として、SHA-256は特に分かりやすい選択肢です。

import hashlib

text = "Hello Python"

hash_value = hashlib.sha256(
    text.encode("utf-8")
).hexdigest()

print(hash_value)

ポイントは次の3段階です。

文字列
 ↓
encode()
 ↓
bytes
 ↓
sha256()
 ↓
hexdigest()
 ↓
ハッシュ値

hashlib.new()でアルゴリズムを指定する

hashlib.new()を使うと、アルゴリズム名を文字列で指定できます。

import hashlib

h = hashlib.new("sha256")

h.update(b"Python")

print(h.hexdigest())

例えば、アルゴリズムを変数で指定することもできます。

import hashlib

algorithm = "sha256"

h = hashlib.new(algorithm)
h.update(b"Python")

print(h.hexdigest())

複数のアルゴリズムを状況に応じて切り替えたい場合に便利です。(Python documentation)


ファイルをhashlibでハッシュ化する

hashlibは文字列だけではなく、ファイルのハッシュ値を計算する用途にも使えます。

例えば、ファイルを読み込んでSHA-256を計算できます。

import hashlib

h = hashlib.sha256()

with open("sample.txt", "rb") as f:
    while chunk := f.read(4096):
        h.update(chunk)

print(h.hexdigest())

ファイル全体を一度にメモリへ読み込むのではなく、一定サイズずつ読み込んでupdate()する方法です。

大きなファイルを扱う場合にも利用しやすい方法です。


hashlibでファイルの改ざんを確認する

ファイルのハッシュ値を利用すると、ファイルが変更されていないか確認できます。

例えば、最初にファイルのSHA-256を計算します。

import hashlib

h = hashlib.sha256()

with open("sample.zip", "rb") as f:
    while chunk := f.read(4096):
        h.update(chunk)

print(h.hexdigest())

後から同じファイルをもう一度ハッシュ化します。

import hashlib

h = hashlib.sha256()

with open("sample.zip", "rb") as f:
    while chunk := f.read(4096):
        h.update(chunk)

print(h.hexdigest())

ファイルの内容が同じなら、基本的に同じハッシュ値になります。

逆に、ファイルの内容が変更されるとハッシュ値も変化するため、ファイルの同一性や改ざんの確認に利用できます。


詳しくは「Python secrets.token_hex()とは?安全なトークンを生成する方法」で解説しています。

MD5やSHA-1は使ってもいい?

hashlibにはmd5()やsha1()も用意されています。

import hashlib

print(hashlib.md5(b"Python").hexdigest())

ただし、MD5やSHA-1には既知の衝突耐性の問題があります。そのため、セキュリティ用途では安易にMD5やSHA-1を選択するべきではありません。Python公式ドキュメントでも、MD5とSHA-1には既知のハッシュ衝突に関する弱点があると注意されています。(Python documentation)

単純なファイル識別など、セキュリティを目的としない用途では既存システムとの互換性などの理由で使われる場合がありますが、用途を確認して選択することが重要です。


hashlibはパスワード保存にも使える?

ここは注意が必要です。

単純に次のようにするだけでは、パスワード保存の方法として十分とはいえません。

import hashlib

password = "password123"

hashed = hashlib.sha256(
    password.encode()
).hexdigest()

パスワードの保存には、一般的なハッシュ関数を単純に1回適用するのではなく、パスワード専用の鍵導出関数(KDF)などを利用することが重要です。

Pythonのhashlibにはpbkdf2_hmac()なども用意されています。

import hashlib

password = b"password123"
salt = b"random_salt"

result = hashlib.pbkdf2_hmac(
    "sha256",
    password,
    salt,
    100000
)

print(result.hex())

実際の認証システムでは、ソルトの生成・保存方法や適切なパラメータ設定なども含めて設計する必要があります。


詳しくは「Python secrets.compare_digest()とは?安全に文字列を比較する方法」で解説しています。

hashlibとhash()の違い

Pythonにはhashlibとは別に、組み込み関数のhash()があります。

例えば、

value = hash("Python")

print(value)

と書けます。

しかし、hash()とhashlibは目的が異なります。

項目 hash() hashlib
種類 組み込み関数 標準ライブラリ
主な用途 Python内部のハッシュ 暗号学的ハッシュなど
SHA-256 × ○
ファイルのハッシュ 不向き ○
セキュリティ用途 基本的に不向き アルゴリズムを選択して利用

Pythonのhash()は、辞書やsetなどで使われるハッシュ値を取得するためのものです。

一方、hashlibはSHA-256などの具体的なハッシュアルゴリズムを扱います。

「Pythonのhash()」と「hashlib」は別物と覚えておきましょう。


hashlibでよく使うメソッド・関数

初心者がまず覚えておきたいものをまとめます。

hashlib.sha256()

SHA-256のハッシュオブジェクトを作成します。

h = hashlib.sha256()

update()

ハッシュ化するデータを追加します。

h.update(b"Python")

hexdigest()

ハッシュ値を16進数の文字列として取得します。

h.hexdigest()

digest()

ハッシュ値をバイト列として取得します。

h.digest()

hashlib.new()

アルゴリズム名を指定してハッシュオブジェクトを作成します。

h = hashlib.new("sha256")

これらを組み合わせることで、さまざまなデータをハッシュ化できます。(Python documentation)


hashlibのまとめ

Pythonのhashlibは、SHA-256などのハッシュアルゴリズムを利用するための標準ライブラリです。

基本的な使い方は次の形です。

import hashlib

result = hashlib.sha256(
    b"Python"
).hexdigest()

print(result)

文字列の場合はencode()を使ってバイト列に変換します。

import hashlib

text = "Python"

result = hashlib.sha256(
    text.encode("utf-8")
).hexdigest()

print(result)

特に覚えておきたいのは、

  • hashlib=ハッシュ処理を行う標準ライブラリ

  • sha256()=SHA-256を使う

  • update()=データを追加する

  • digest()=バイト列で取得する

  • hexdigest()=16進数文字列で取得する

  • new()=アルゴリズム名を指定する

  • ファイルの同一性確認などにも利用できる

  • MD5やSHA-1はセキュリティ用途では注意が必要

という点です。

Pythonでセキュリティ、ファイル管理、データ検証などを扱うようになると、hashlibはよく登場するライブラリです。まずはsha256()とhexdigest()の使い方から覚えるとよいでしょう。(Python documentation)


secretsの関連記事