Python逆引き大全|初心者から実務まで使えるセキュリティ関連の実践テクニック セキュリティ関連の開発編!

逆引き

セキュリティはPythonを使用する際に避けて通れない重要なテーマです。本記事では、基本的なセキュリティ技術から高度な実践テクニックまでを解説し、実務で役立つコード例を提供します。


パスワードのハッシュ化

パスワードを安全に管理するために、hashlibbcryptライブラリを使用してハッシュ化します。

例: 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プログラミングで避けられない重要な要素です。本記事では、パスワードの保護からセキュリティログの監視まで、幅広い技術を紹介しました。これらの知識を活用して、より安全なシステムを構築してください。

このサイトを稼働しているVPSはこちら

コメント

タイトルとURLをコピーしました