Closed6

Python3_secretsモジュール, hashlibモジュール

かじるかじる

Python実践レシピより

Python3エンジニア認定実践試験メモ

secretsモジュール

ランダムで文字を選ぶ

main.py
import random, secrets, string
from urllib import parse

# 英字+数字
alpha_num = string.ascii_letters + string.digits
print(alpha_num)

# 英字+数字からランダムで8文字選ぶ
password = "".join(secrets.choice(alpha_num) for i in range(8))
print(password)
かじるかじる

トークンの生成

main.py
import random, secrets, string
from urllib import parse

# トークンの生成(引数はトークンサイズ)
print(secrets.token_bytes(8))# バイト列
# b'\xd7)\xb4\x1f\xcf0\xf1\xae'

print(secrets.token_hex(8))# 16進数
# 6b9870784b136bff

print(secrets.token_urlsafe(8))# URL用テキスト(Base64)
# NLiIK-A81g4
かじるかじる

トークンの生成と比較

main.py
import random, secrets, string
from urllib import parse

# 1, トークンの生成
token = secrets.token_urlsafe(8)
print(f"token: {token}")
# token: Gp_Kq8wOhLc

# 2, トークンをURLに設定する
url = f"https://hoge.com/?reset={token}"
parsed = parse.urlparse(url)
query = parse.parse_qs(parsed.query)
print(f"reset: {query["reset"][0]}")
# reset: Gp_Kq8wOhLc

# 3, 元のトークンと、URLからのトークンを比較する
print(secrets.compare_digest(token, query["reset"][0]))
# True
かじるかじる

10文字のパスワードを生成

英字、数字、特殊文字をそれぞれ1文字以上含む

main.py
# 1, 英字を配列に
letters = [i for i in string.ascii_letters]
random.shuffle(letters)
#print(letters)

# 2, 数字を配列に
digits = [i for i in string.digits]
random.shuffle(digits)
#print(digits)

# 3, 記号を配列に
puncs = [i for i in string.punctuation]
random.shuffle(puncs)
#print(puncs)

# 4, 3つの要素数を確定
len_pass = 10# パスワード文字数
nums = [i+1 for i in range(len_pass-1)]
random.shuffle(nums)
thres = sorted(nums[:2])# 文字、数字、記号の境界
print(thres)

# 5, 3つの要素数分だけ英字、数字、記号から抜き出し連結
letters = letters[0:thres[0]]
digits = digits[0:thres[1]-thres[0]]
puncs = puncs[0:len_pass-thres[1]]

# 6, 3つの配列を連結しシャッフル
arr = letters
arr += digits
arr += puncs
random.shuffle(arr)
password = "".join(arr)
print(password)
# s$efK{\`U3
かじるかじる

hashlibモジュール

main.py
import hashlib

# 利用可能なハッシュ関数(全てのプラットフォーム)
print(hashlib.algorithms_guaranteed)
# {'sha224', 'sha256', 'sha384', 'sha512', ...(以下略)}

# 利用可能なハッシュ関数(実行中の端末)
print(hashlib.algorithms_available)
# {'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', ...(以下略)}

# sha256
print(hashlib.sha256(b"Hello, hashlib!!").hexdigest())
# 55dd59f6667894e79bbbe16233ce...(以下略)

# sha384
print(hashlib.sha384(b"Hello, hashlib!!").hexdigest())
# 58a931d8269d66084a8bc824967e...(以下略)

# sha512
print(hashlib.sha512(b"Hello, hashlib!!").hexdigest())
# ec3fcf998b9f8823824e69ade572...(以下略)
かじるかじる

安全なパスワードハッシュを生成

main.py
import hashlib

algorithm = "sha256"# アルゴリズム
password = b"Your secret password!!"# ハッシュ化対象
salt = b"Your secret salt!!"# ソルト
iteration = 1000# ストレッチング回数(推奨値:100000)

# ハッシュ処理
h_password = hashlib.pbkdf2_hmac(algorithm, password, salt, iteration).hex()
print(h_password)
# 55dd59f6667894e79bbbe16233ce...(以下略)
このスクラップは2ヶ月前にクローズされました