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

Pythonで実現するメッセージ認証:HMACによるキー付きハッシュの基本と使い方

Pythonでは、暗号学的ハッシュ関数を用いたメッセージ認証を、HMAC(Keyed-Hash Message Authentication Code)という仕組みによって簡単に実現できます。HMACはMD5やSHA-1など、複数の反復型ハッシュ関数と共有秘密鍵を組み合わせて使用できる汎用的な認証方式です。

基本的な考え方はシンプルです。実際のデータと共有秘密鍵を組み合わせて暗号学的ハッシュ値を生成することで、データを保護します。送信されるのはハッシュ値のみで、秘密鍵そのものは含まれません。受信側はこのハッシュ値を利用して、送信または保存されたメッセージが改ざんされていないかを検証できます。

HMACの基本構文

hmac.new(key, msg = None, digestmod = None)

この関数は新しいHMACオブジェクトを生成して返します。各引数の意味は以下の通りです。

  • key – 送受信者間で共有する秘密鍵を指定します。
  • msg – ハッシュ化対象となるメッセージを指定します。
  • digestmod – HMACオブジェクトが使用するダイジェスト名またはモジュール(例:hashlib.md5、hashlib.sha256)を指定します。

HMACモジュールの主なメソッドと属性

  • hmac.update(message)

    指定したメッセージでHMACオブジェクトを更新します。このメソッドを複数回呼び出した場合、メッセージは連結(追記)されます。

  • hmac.digest()

    これまでupdate()メソッドに渡されたバイト列のダイジェスト値を返します。

  • hmac.hexdigest()

    digest()と同様ですが、ダイジェストを16進数文字列のみで構成される、元の2倍の長さの文字列として返します。メールなどバイナリデータを扱えない環境でも安全に値をやり取りできるのが特徴です。

  • hmac.copy()

    HMACオブジェクトのコピー(クローン)を返します。共通の初期状態から複数のハッシュを計算したい場合に便利です。

サンプルコード1:デフォルトのMD5でハッシュを生成

まず、標準的なMD5アルゴリズムを使用してハッシュを作成する例を見てみましょう。

# ライブラリをインポート
import hashlib
import hmac

# データ
update_bytes = b'Lorem ipsum dolor sit amet, consectetur adipiscing elit. \
    Suspendisse tristique condimentum viverra. Nulla accumsan \
    orci risus, non congue lacus feugiat id.'

# 秘密鍵
password = b'402xy5#'

# MD5を使用して暗号学的ハッシュを生成
my_hmac = hmac.new(update_bytes, password, hashlib.md5)
print("最初のダイジェスト: " + str(my_hmac.digest()))
print("正規名: " + my_hmac.name)
print("ブロックサイズ: " + str(my_hmac.block_size) + "バイト")
print("ダイジェストサイズ: " + str(my_hmac.digest_size) + "バイト")

# HMACオブジェクトのコピーを作成
my_hmac_cpy = my_hmac.copy()
print("コピーのダイジェスト: " + str(my_hmac_cpy.digest()))

実行結果

最初のダイジェスト: b'H\xcc.nf\xdd\x8bC\x8di\x0cC\xb8\xe9l\xa8'
正規名: hmac-md5
ブロックサイズ: 64バイト
ダイジェストサイズ: 16バイト
コピーのダイジェスト: b'H\xcc.nf\xdd\x8bC\x8di\x0cC\xb8\xe9l\xa8'

SHA-1への切り替え

MD5よりもSHA-1の方が安全性が高いとされており、上記プログラムをSHA-1で実行したい場合は、該当行のアルゴリズム名を変更するだけです。

my_hmac = hmac.new(update_bytes, password, hashlib.sha1)

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

最初のダイジェスト: b'\xc3T\xe7[\xc8\xa3O/$\xbd`A\xad\x07d\xe8\xae\xa2!\xb4'
正規名: hmac-sha1
ブロックサイズ: 64バイト
ダイジェストサイズ: 20バイト
コピーのダイジェスト: b'\xc3T\xe7[\xc8\xa3O/$\xbd`A\xad\x07d\xe8\xae\xa2!\xb4'

なお、現在ではより強固なセキュリティが求められる場面では、SHA-256などの新しいアルゴリズムを選択することが推奨されています。digestmodの引数をhashlib.sha256に変更するだけで同様に利用可能です。

HMACの活用シーン

HMACによる認証機構は、公共ネットワークサービスのようにセキュリティが重要視されるあらゆる場面で活用できます。たとえば、公開ネットワーク上でパイプやソケット経由に重要なファイルやデータを送信する場合、そのデータに署名を付与し、受信側でデータを使用する前に署名を検証するといった運用が一般的です。これにより、通信途中での改ざんやなりすましを効果的に防ぐことができます。

  1. Windowsで使えるPython開発用IDEおすすめ7選|PyCharmからAtomまで徹底解説

    Windows環境でPythonの開発を始めるとき、最初に悩むのが「どのIDE(統合開発環境)を選ぶべきか」という問題です。IDEはコードの編集・実行・デバッグなどをひとつのアプリケーションで完結できる強力なツールであり、選択次第で開発効率が大きく変わります。 本記事では、Windowsで利用できる代表的なPython対応IDEを厳選し、それぞれの特徴やメリットをわかりやすく解説します。 PyCharm PyCharmはJetBrains社が開発する、Python開発で最も人気のあるIDEのひとつです。無料のコミュニティ版と有料のプロフェッショナル版が用意されており、初心者からプロフェッショ

  2. Pythonコードを高速化する11の最適化テクニック

    Pythonはコンパイル言語ほど高速ではないことは周知の事実ですが、大手企業がPythonで大規模なワークロードを処理している事例からも分かるように、決して「遅い言語」ではありません。この記事では、正しく動作するPythonプログラムをさらに速く、効率的にするために押さえておきたい最適化のヒントを11個紹介します。 ヒント1: 組み込み関数を活用する Pythonで独自に効率的なコードを書くことも可能ですが、C言語で実装された組み込み関数の速度には到底及びません。利用可能な組み込み関数はdir(__builtins__)で一覧表示できるので、車輪の再発明をする前に必ず確認しましょう。 ヒン