Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでSHAハッシュを生成する方法|hashlibモジュールの使い方を徹底解説

セキュリティは、あらゆるIT企業にとって最重要課題の一つです。大切なデータを保護し、検証するために、さまざまなハッシュ技術が活用されています。本記事では、Pythonのhashlibモジュールを使ったSHAハッシュ化の基本について、サンプルコード付きでわかりやすく解説します。

ハッシュとは何か

ハッシュとは、可変長のバイト列を入力として受け取り、固定長のバイト列へ変換する関数のことです。ただし、一度ハッシュ化したデータから元のデータ(入力バイト列)を復元することは極めて困難です。たとえば、入力をx、ハッシュ関数をfとすると、f(x)の計算は高速かつ簡単に行えますが、その結果からxを逆算することは非常に時間のかかる作業になります。

ハッシュ関数の戻り値は、「ハッシュ」「チェックサム」「ハッシュ値」「メッセージダイジェスト」などと呼ばれます。

以上を図にまとめると、次のようになります。

PythonでSHAハッシュを生成する方法|hashlibモジュールの使い方を徹底解説

たとえば、「Hello World」というメッセージをSHA1ハッシュ関数で変換すると、結果は次のようになります。

0a4d55a8d778e5022fab701977c5d840bbc486d0

PythonでSHAハッシュを生成する方法|hashlibモジュールの使い方を徹底解説

実務において、ハッシュ関数は暗号アルゴリズム、デジタル署名、指紋認証、パスワードの保存など、幅広い分野で活用されています。Pythonプログラマーにとっても、データやファイルの重複チェック、公衆ネットワーク経由でデータを送信する際の整合性確認、データベースへのパスワード保存など、ハッシュ関数は欠かせない存在です。

代表的なハッシュアルゴリズム:MD5とSHA

特によく使われるハッシュ関数(アルゴリズム)には、次の2つがあります。

  • MD5 … MD5(Message Digest Algorithm)は128ビットのハッシュ値を生成します。いくつかのセキュリティ上の脆弱性が判明しているため、現在では主にデータ整合性の確認用途に限って使用されるのが一般的です。

  • SHA … SHAグループには複数のアルゴリズムが含まれており、米国連邦情報処理標準(FIPS)として開発されました。MD5よりはるかに安全性が高いため、暗号アプリケーションをはじめとするさまざまな分野で広く採用されています。生成されるメッセージダイジェストは160ビットから512ビットの範囲です。

SHA1ハッシュをPythonで計算する

SHAには、SHA1、SHA224、SHA256、SHA384、SHA512といった一連のアルゴリズムがあります。このうちSHA1はMD5よりも安全とされ、多くの場面で利用されてきました。

まず、ハッシュアルゴリズムを使用するには、hashlibモジュールをインポートします。

import hashlib

続いて、必要なアルゴリズムが利用可能かどうか、またhashlibモジュールで現在使用できるアルゴリズムの一覧を確認してみましょう。

>>> print(hashlib.algorithms_available)
{'sha3_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'dsaEncryption', 'dsaWithSHA', 'DSA', 'md5', 'sha384', 'sha224', 'sha3_384', 'ecdsa-with-SHA1', 'DSA-SHA', 'SHA1', 'md4', 'SHA256', 'MD4', 'sha3_512', 'whirlpool', 'sha256', 'shake_256', 'SHA', 'RIPEMD160', 'shake_128', 'SHA512', 'ripemd160', 'SHA224', 'sha', 'blake2s', 'SHA384', 'MD5'}

このalgorithms_availableの一覧には、OpenSSL経由で提供されるアルゴリズムも含まれています。

一方、どの環境でも必ず利用できることが保証されているアルゴリズムの一覧を確認したい場合は、algorithms_guaranteedを使用します。

>>> print(hashlib.algorithms_guaranteed)
{'sha3_512', 'sha256', 'sha3_256', 'shake_256', 'sha3_224', 'sha1', 'blake2b', 'sha512', 'md5', 'shake_128', 'sha384', 'sha224', 'sha3_384', 'blake2s'}

それでは、SHA1アルゴリズムの動作を理解するために、簡単なプログラムを作成してみましょう。

import hashlib
hash_obj = hashlib.sha1(b'Hello, Python!')
print(hash_obj.hexdigest())

出力

00d375a3693fde63e9540b91656c6ac5b5341f7c

16進数の文字列ではなく、バイト列そのものを受け取りたい場合は、hash_obj.digest()を使用します。

import hashlib
hash_obj = hashlib.sha1(b'Hello, Python!')
# バイト列を生成して表示
print(hash_obj.digest())

出力

b'\x00\xd3u\xa3i?\xdec\xe9T\x0b\x91elj\xc5\xb54\x1f|'

ここで注目していただきたいのは、文字列リテラルの先頭に「b」を付けている点です。これは文字列からバイト列を生成するための記法で、ハッシュ関数はパラメータとしてバイト列のみを受け付けるため必要となります。

ユーザー入力をハッシュ化する方法

コンソールから入力された文字列をハッシュ化したい場合は、忘れずに文字列をバイト列へエンコードしてください。encode()メソッドを使うだけで簡単に変換できます。

import hashlib
mystring = input('Enter string to hash: ')
hash_obj = hashlib.sha1(mystring.encode())
print(hash_obj.hexdigest())

出力

Enter string to hash: Hello, TutorialsPoint
b20d14ead3e50552fc1f1cd96696b111a163dffa

まとめ

Pythonでは、標準ライブラリのhashlibモジュールを使うことで、SHA1をはじめとする各種ハッシュアルゴリズムを簡単に利用できます。ポイントは次の3つです。

  • ハッシュ関数にはバイト列を渡す必要があるため、文字列には「b」プレフィックスを付けるか、encode()でエンコードする
  • 16進数文字列が欲しい場合はhexdigest()、バイト列が欲しい場合はdigest()を使う
  • 利用可能なアルゴリズムはalgorithms_available、保証されているアルゴリズムはalgorithms_guaranteedで確認できる

なお、SHA1にも理論上の脆弱性が報告されており、セキュリティが重要な用途(パスワード保存や電子署名など)では、SHA256以上の強度の高いアルゴリズムを選択することが推奨されます。用途に応じて適切なハッシュアルゴリズムを選びましょう。

  1. PythonでMD5ハッシュを生成する方法|hashlibモジュールの使い方を徹底解説

    データセキュリティは、あらゆるIT企業にとって最重要課題の一つです。データを保護し、その完全性を検証するために、さまざまなハッシュ技術が活用されています。本記事では、Pythonを使ってMD5ハッシュを生成・エンコードする方法を、具体的なコード例とともにわかりやすく解説します。 ハッシュとは何か ハッシュとは、可変長のバイト列を入力として受け取り、それを固定長のバイト列へと変換する関数のことです。重要な特徴として、元のデータ(入力されたバイト列)を復元することが極めて困難である点が挙げられます。例えば、入力を x、ハッシュ関数を f とした場合、f(x) の計算は高速かつ簡単に行えますが、そこ

  2. PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法

    はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c