📘
学習記録_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」を含む行だけを抽出する
secrets
モジュール(安全な乱数)
3. 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
はバイト列を返す点に注意
random
モジュールとの違い
4. -
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'}
👉 &
は「集合の共通部分(積集合)」を表す
hashlib
モジュール(ハッシュ計算)
6. ハッシュとは?
- データから計算される「固定長の指紋」
- 元のデータは復元できない(不可逆)
基本
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())
algorithms_available
/ algorithms_guaranteed
9. import hashlib
print(hashlib.algorithms_available) # 環境で使える全て
print(hashlib.algorithms_guaranteed) # どの環境でも必ず使える
✅ まとめポイント
-
venv
は実行した Python のバージョンで環境を作る -
secrets
はセキュアな乱数、random
は擬似乱数 -
hashlib
はハッシュ(元に戻せない「指紋」)を作る -
digest
= バイト列、hexdigest
= 16進文字列 - ソルトはレインボーテーブル攻撃を防ぐために十分長くする
Discussion