付録D: セキュリティベストプラクティス

ゲノムデータの安全な取り扱い

import hashlib
import os
from cryptography.fernet import Fernet

class SecureGenomicDataHandler:
    """ゲノムデータの安全な取り扱い"""
    
    def __init__(self):
        # 暗号化キーの生成(実際には安全に保管)
        self.key = Fernet.generate_key()
        self.cipher = Fernet(self.key)
    
    def anonymize_sample_id(self, original_id):
        """サンプルIDの匿名化"""
        # SHA-256ハッシュによる不可逆変換
        hash_object = hashlib.sha256(original_id.encode())
        return hash_object.hexdigest()[:16]
    
    def encrypt_sensitive_data(self, data):
        """機密データの暗号化"""
        if isinstance(data, str):
            data = data.encode()
        
        encrypted = self.cipher.encrypt(data)
        return encrypted
    
    def secure_delete(self, filepath):
        """安全なファイル削除"""
        if os.path.exists(filepath):
            # ランダムデータで上書き
            filesize = os.path.getsize(filepath)
            
            with open(filepath, "ba+", buffering=0) as f:
                for _ in range(3):  # 3回上書き
                    f.seek(0)
                    f.write(os.urandom(filesize))
            
            # ファイル削除
            os.remove(filepath)

アクセス制御の実装

from functools import wraps
import jwt
from datetime import datetime, timedelta

class AccessControl:
    """ゲノムデータへのアクセス制御"""
    
    def __init__(self, secret_key):
        self.secret_key = secret_key
        
    def generate_token(self, user_id, permissions):
        """アクセストークンの生成"""
        payload = {
            'user_id': user_id,
            'permissions': permissions,
            'exp': datetime.utcnow() + timedelta(hours=24)
        }
        
        token = jwt.encode(payload, self.secret_key, algorithm='HS256')
        return token
    
    def verify_permission(self, required_permission):
        """権限検証デコレータ"""
        def decorator(func):
            @wraps(func)
            def wrapper(self, token, *args, **kwargs):
                try:
                    payload = jwt.decode(
                        token, 
                        self.secret_key, 
                        algorithms=['HS256']
                    )
                    
                    if required_permission not in payload['permissions']:
                        raise PermissionError("Insufficient permissions")
                        
                    return func(self, *args, **kwargs)
                    
                except jwt.ExpiredSignatureError:
                    raise ValueError("Token expired")
                except jwt.InvalidTokenError:
                    raise ValueError("Invalid token")
                    
            return wrapper
        return decorator

← 前へ: パフォーマンス最適化 目次に戻る 次へ: コード例集 →