Pythonのhashlibモジュールでハッシュとメッセージダイジェストを安全に扱う方法
Federal Information Processing Standard(FIPS:連邦情報処理標準)では、SHA1、SHA224、SHA256、SHA384、SHA512といった安全なハッシュアルゴリズムが定義されています。また、開発者であるRivest、Shamir、Adlemanの3人の姓の頭文字から名付けられたRSAでは、MD5アルゴリズムが定義されています。これらの初期のアルゴリズムは「メッセージダイジェスト」と呼ばれていましたが、現在では「セキュアハッシュ」という用語が主流になっています。
Pythonのhashlibモジュールは、以下のアルゴリズムを実装するために使用されます。
- md5
- sha1
- sha224
- sha256
- sha384
- sha512
hashlib.new(name[, data])
new()は汎用的なコンストラクタで、第一引数に使用したいアルゴリズム名を文字列で指定します。上記のリストにあるハッシュだけでなく、OpenSSLライブラリが提供するその他のアルゴリズムにもアクセスできるのが特徴です。ただし、名前付きコンストラクタの方がnew()よりも高速に動作するため、特別な理由がない限りは名前付きコンストラクタを使うことが推奨されます。
>>> import hashlib
>>> hash = hashlib.new('md5', b'hello')
>>> hash.hexdigest()
'5d41402abc4b2a76b9719d911017c592'
個別の名前付きコンストラクタを使用する例
>>> msg = hashlib.sha256()
>>> msg.update(b'Simple is better than complex')
>>> msg.digest()
b'\xabz\xd8C(n\xb3\x8b\xf6\x0c\x0e\xf2\x81z\xd7\xf93\x835\xb2\xa1\x9cM\xb1S\x1f\xf7\xf9\x1av-F'
>>> msg.block_size
64
>>> msg.hexdigest()
'ab7ad843286eb38bf60c0ef2817ad7f9338335b2a19c4db1531ff7f91a762d46'
>>> msg = hashlib.md5()
>>> msg.update(b'Simple is better than complex')
>>> msg.hexdigest()
'fd34bb8fafd17f1a21d7bb6e38c8dc68'
ハッシュオブジェクトの主なメソッド
| update() | バイトライクオブジェクトでハッシュオブジェクトを更新します。m.update(a); m.update(b) は m.update(a+b) と同等の結果になります。 |
| digest() | update()メソッドに渡されたデータの、現時点までのダイジェストを返します。 |
| hexdigest() | 16進数の数字のみを含む、倍の長さの文字列オブジェクトとしてダイジェストを返します。 |
| copy() | ハッシュオブジェクトのコピーを返します。先頭部分が共通する複数のデータのダイジェストを効率的に計算したい場合に便利です。 |
hashlibが提供する主な属性
| algorithms_guaranteed | すべてのプラットフォームでこのモジュールによるサポートが保証されているハッシュアルゴリズム名を格納したセットです。 |
| algorithms_available | 実行中のPythonインタプリタで実際に利用可能なハッシュアルゴリズム名を格納したセットです。 |
| digest_size | 生成されるハッシュのサイズ(バイト単位)です。 |
| block_size | ハッシュアルゴリズムの内部ブロックサイズ(バイト単位)です。 |
| name | このハッシュの正式名称。常に小文字で表記され、new()の引数としてそのまま渡すことで同じ種類のハッシュを再作成できます。 |
可変長ダイジェストとBLAKE2
shake_128()およびshake_256()アルゴリズムは可変長のダイジェストを提供し、length_in_bits//2 の計算により、最大128ビットまたは256ビットのセキュリティ強度を実現します。
BLAKE2はRFC 7693で定義された暗号学的ハッシュ関数で、以下の2つのバリエーションがあります。
- BLAKE2b:64ビットプラットフォーム向けに最適化されており、1〜64バイトの任意のサイズのダイジェストを生成します。
- BLAKE2s:8〜32ビットプラットフォーム向けに最適化されており、1〜32バイトの任意のサイズのダイジェストを生成します。
なお、MD5やSHA1は現在では衝突耐性の面で安全性が損なわれているとされており、セキュリティが重要な用途にはSHA256以上のアルゴリズムやBLAKE2の使用が推奨されます。
-
PythonでSHAハッシュを生成する方法|hashlibモジュールの使い方を徹底解説
セキュリティは、あらゆるIT企業にとって最重要課題の一つです。大切なデータを保護し、検証するために、さまざまなハッシュ技術が活用されています。本記事では、Pythonのhashlibモジュールを使ったSHAハッシュ化の基本について、サンプルコード付きでわかりやすく解説します。ハッシュとは何かハッシュとは、可変長のバイト列を入力として受け取り、固定長のバイト列へ変換する関数のことです。ただし、一度ハッシュ化したデータから元のデータ(入力バイト列)を復元することは極めて困難です。たとえば、入力をx、ハッシュ関数をfとすると、f(x)の計算は高速かつ簡単に行えますが、その結果からxを逆算することは非
-
PythonでMD5ハッシュを生成する方法|hashlibモジュールの使い方を徹底解説
データセキュリティは、あらゆるIT企業にとって最重要課題の一つです。データを保護し、その完全性を検証するために、さまざまなハッシュ技術が活用されています。本記事では、Pythonを使ってMD5ハッシュを生成・エンコードする方法を、具体的なコード例とともにわかりやすく解説します。 ハッシュとは何か ハッシュとは、可変長のバイト列を入力として受け取り、それを固定長のバイト列へと変換する関数のことです。重要な特徴として、元のデータ(入力されたバイト列)を復元することが極めて困難である点が挙げられます。例えば、入力を x、ハッシュ関数を f とした場合、f(x) の計算は高速かつ簡単に行えますが、そこ