📘

学習記録_Python実践レシピ(第1章、第18章)

に公開

1. 仮想環境と Python バージョン

仮想環境の作成

python3 -m venv .venv
  • 実行したときの Python 実行ファイル をコピーして .venv 内に環境を作る
  • 「ディレクトリの階層」は関係なく、実行に使った Python のバージョン がその仮想環境で使われる

例:

$ python3 --version
Python 3.11.8
$ python3 -m venv .venv

→ この .venv では Python 3.11.8 が使われる


2. Linuxコマンド

  • which python → どのパスの Python が実行されるかを表示

  • python -V → バージョン確認

  • which pip → どの pip が使われるか表示

  • sudo apt install -y python3-pip

    • -y は「Yes」を自動回答してインストールを進めるオプション
  • | (パイプ)

    • コマンドの出力を次のコマンドの入力に渡す
pip list | grep Django

pip list の結果から「Django」を含む行だけを抽出する


3. secrets モジュール(安全な乱数)

choice()

import secrets
print(secrets.choice([1, 2, 3, 4, 5]))  # 例: 3
  • リストから 1 つだけ安全にランダム選択
  • 返り値はリストの要素(int や str など)

token 系

  • token_bytes(n) → n バイトのランダムバイト列
secrets.token_bytes(8)
# 例: b'\xa1\x8f\x12\xbb\xff@q\xc4'
  • token_hex(n) → 16進文字列
secrets.token_hex(8)
# 例: 'a13b2f7c9d8e6f00'
  • token_urlsafe(n) → URLで安全に使える文字列
secrets.token_urlsafe(8)
# 例: 'vY3_pZ1QaW8'

randbelow()

print(secrets.randbelow(10))   # 0〜9 の整数
print(type(secrets.randbelow(10)))  # <class 'int'>

👉 randbelow は整数、token_bytes はバイト列を返す点に注意


4. random モジュールとの違い

  • random → 擬似乱数(シミュレーション用など)
  • secrets → 暗号論的に安全な乱数(パスワード、トークン生成に推奨)
import random, secrets

print(random.choice([1,2,3]))   # 例: 2(擬似乱数)
print(secrets.choice([1,2,3]))  # 例: 3(暗号学的に安全)

5. 集合演算(&

"A" & set("ABCD")   # ❌ 文字列に & は使えない

正しくは:

{"A"} & set("ABCD")
# 結果: {'A'}

👉 & は「集合の共通部分(積集合)」を表す


6. hashlib モジュール(ハッシュ計算)

ハッシュとは?

  • データから計算される「固定長の指紋」
  • 元のデータは復元できない(不可逆)

基本

import hashlib

h = hashlib.sha256(b"hello")
print(h.digest())    # バイト列
print(h.hexdigest()) # 16進文字列
  • update(data) → 追加でデータを食わせる
  • .digest() / .hexdigest() → 計算結果を取り出す(初めてハッシュ値になる)

7. 関連用語

  • ダイジェスト値 = ハッシュ計算後の出力(固定長データ)
  • ハッシュアルゴリズム = SHA256, MD5 など方式の名前
  • チェックサム = 転送時の誤り検出用の簡易ハッシュ
  • レインボーテーブル攻撃
    → あらかじめ作った「入力 → ハッシュ」の辞書で逆引きする攻撃
    → ソルトを短くすると簡単に対応表が作れるので危険

8. PBKDF2-HMAC

パスワードを安全にハッシュ化する方法(繰り返し計算で強化)

import hashlib, os

password = b"mypassword"
salt = os.urandom(16)

key = hashlib.pbkdf2_hmac(
    'sha256',        # ハッシュ方式
    password,        # パスワード
    salt,            # ソルト
    100000           # 繰り返し回数
)
print(key.hex())

9. algorithms_available / algorithms_guaranteed

import hashlib
print(hashlib.algorithms_available)   # 環境で使える全て
print(hashlib.algorithms_guaranteed)  # どの環境でも必ず使える

✅ まとめポイント

  • venv は実行した Python のバージョンで環境を作る
  • secrets はセキュアな乱数、random は擬似乱数
  • hashlib はハッシュ(元に戻せない「指紋」)を作る
  • digest = バイト列、hexdigest = 16進文字列
  • ソルトはレインボーテーブル攻撃を防ぐために十分長くする

Discussion