現代のソフトウェア開発において、セキュリティは最も重要な要素の一つです。Pythonには、安全な乱数生成やハッシュ化を実現するための標準モジュールが用意されています。本記事では、secrets、hashlibモジュールを通じて、機密情報の保護、トークン生成、データの完全性確認など、実践的なセキュリティ技術の基本を解説します。プライバシーとデータ保護の観点から、これらのモジュールの重要な機能と使用方法を学んでいきましょう。
secrets
・secretsは、randomと同じく乱数を生成するモジュールですが、randomよりも予測が困難であり機密情報を扱う場合に採用されます。
・secrets.choice(str)でstr内の文字列をランダムで抽出し、パスワードなどを生成できます。
import secrets
import string
# パスワード生成(乱数)
alphanum = string.ascii_letters + string.digits
# >>> abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
password = "".join(secrets.choice(alphanum) for _ in range(8))
# >>> MUtpCCge
・トークン生成にも活用でき、token_bytes()はバイト列、token_hex()は16進数文字列、token_urlsafe()はBase64にエンコードされた文字列が引数内に指定した文字数で出力されます。
# トークン生成
secrets.token_bytes(8)
# >>> b'\xb6\xb4\xc5\x8fh\xad\x03N'
secrets.token_hex(8)
# >>> c6b7bead1c78909d
secrets.token_urlsafe(8)
# >>> bKh5vrfkz5s
・また、compare_digest(token1,token2)では、トークンの比較や検証で使用されます。
# トークン比較
from urllib import parse
token = secrets.token_urlsafe()
url = "https://example.com/index.html?token=" + token
url_parse = parse.urlparse(url)
query_parse = parse.parse_qs(url_parse.query)
secrets.compare_digest(token, query_parse["token"][0])
# >>> True
hashlib
・hashlibモジュールでは、ハッシュ値を生成することができます。ハッシュ化では同じデータから同じハッシュ値が生成され、元のデータには戻すことができないです。(不可逆変換)
・hashlib.algorithms_availableでは、利用している環境で使用可能なハッシュアルゴリズムを取得します。
import hashlib
hashlib.algorithms_available
# >>> {'sha224', 'blake2s', 'shake_128', 'sm3', 'sha3_224', 'blake2b', 'sha3_384', 'sha512_256', 'sha384', 'sha512_224', 'sha1', 'sha3_512', 'sha256', 'md5', 'ripemd160', 'shake_256', 'sha512', 'md5-sha1', 'sha3_256'}
・ハッシュ化するためには、まずハッシュアルゴリズムに対応したオブジェクトを作成します(hashlib.sha256())。その後、.update(byte)でハッシュ化したい値を渡しますが、str型ではなくbyte型で渡す必要があります。.hexdigest()で、ハッシュ化された値を16進数の文字列で取得できます。
hash_sha256=hashlib.sha256()
hash_sha256.update(b'python aaa bbb')
hash_sha256.hexdigest()
# >>> 29b71b027dc4f9446884f4ffff7c65031a3a74cc51e5e8766b1cc06392176805