セキュリティはPythonを使用する際に避けて通れない重要なテーマです。本記事では、基本的なセキュリティ技術から高度な実践テクニックまでを解説し、実務で役立つコード例を提供します。
パスワードのハッシュ化
パスワードを安全に管理するために、hashlib
やbcrypt
ライブラリを使用してハッシュ化します。
例: bcryptを使ったハッシュ化
import bcrypt
password = "mypassword".encode()
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
print(hashed)
# ハッシュの検証
if bcrypt.checkpw(password, hashed):
print("Password match")
else:
print("Password does not match")
暗号化と復号化
データを暗号化して安全に保存・転送するには、cryptography
ライブラリが便利です。
例: 対称暗号の使用
from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher = Fernet(key)
message = "This is a secret".encode()
encrypted_message = cipher.encrypt(message)
print(encrypted_message)
# 復号化
decrypted_message = cipher.decrypt(encrypted_message)
print(decrypted_message.decode())
トークン認証
トークンベースの認証はAPIセキュリティの基本です。jwt
ライブラリを使用してトークンを生成・検証します。
例: JWTの生成と検証
import jwt
import datetime
secret_key = "mysecret"
# トークン生成
payload = {"user_id": 123, "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1)}
token = jwt.encode(payload, secret_key, algorithm="HS256")
print(token)
# トークンの検証
try:
decoded = jwt.decode(token, secret_key, algorithms=["HS256"])
print(decoded)
except jwt.ExpiredSignatureError:
print("Token expired")
SQLインジェクションの防止
SQLインジェクション対策には、常にパラメータ化されたクエリを使用します。
例: sqlite3を使用した安全なクエリ
import sqlite3
connection = sqlite3.connect("example.db")
cursor = connection.cursor()
username = "admin"
password = "password123"
# パラメータ化されたクエリ
cursor.execute("SELECT * FROM users WHERE username=? AND password=?", (username, password))
user = cursor.fetchone()
print(user)
XSS対策
クロスサイトスクリプティング(XSS)の防止には、入力データをエスケープすることが重要です。
例: HTMLエスケープ
import html
user_input = '<script>alert("XSS")</script>'
safe_input = html.escape(user_input)
print(safe_input) # 出力: <script>alert("XSS")</script>
CSRF対策
クロスサイトリクエストフォージェリ(CSRF)を防ぐには、トークンを使用します。
例: CSRFトークンの生成と検証
import secrets
# トークンの生成
csrf_token = secrets.token_hex(32)
print(csrf_token)
# トークンの検証
input_token = "user_provided_token"
if secrets.compare_digest(csrf_token, input_token):
print("CSRF token is valid")
else:
print("CSRF token is invalid")
セキュアな通信の実現(SSL/TLS)
安全な通信を確立するには、ssl
モジュールを使用します。
例: HTTPSサーバーの作成
import http.server
import ssl
server_address = ('', 4443)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile="key.pem", certfile="cert.pem", server_side=True)
httpd.serve_forever()
ファイルの署名と検証
ファイルの整合性を確認するには、デジタル署名を使用します。
例: ファイル署名の生成と検証
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding, rsa
# 鍵ペアの生成
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = private_key.public_key()
# ファイル署名
message = b"important data"
signature = private_key.sign(message, padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH), hashes.SHA256())
# 検証
try:
public_key.verify(signature, message, padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH), hashes.SHA256())
print("Signature is valid")
except:
print("Signature is invalid")
セキュリティスキャンの実施
静的解析ツールやパッケージスキャナーを使用して脆弱性を特定します。
例: banditを使用した静的解析
pip install bandit
bandit -r your_project/
セキュリティログの監視
セキュリティインシデントの追跡には、ログをモニタリングします。
例: ログの記録と監視
import logging
logging.basicConfig(filename="security.log", level=logging.INFO, format="%(asctime)s - %(message)s")
logging.info("User login attempt detected")
まとめ
セキュリティはPythonプログラミングで避けられない重要な要素です。本記事では、パスワードの保護からセキュリティログの監視まで、幅広い技術を紹介しました。これらの知識を活用して、より安全なシステムを構築してください。
コメント