File size: 3,881 Bytes
acabbdd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
from cryptography.fernet import Fernet
import json
import os
import base64
import hashlib
from typing import Dict, Any, Optional
from datetime import datetime, timedelta

class SecureStorage:
    """Hassas verileri şifreleyerek saklamak için sınıf"""
    
    def __init__(self, storage_dir: str = "./secure_data"):
        """

        Args:

            storage_dir: Şifreli verilerin saklanacağı dizin

        """
        # Depolama dizinini oluştur
        os.makedirs(storage_dir, exist_ok=True)
        self.storage_dir = storage_dir
        
        # Şifreleme anahtarı
        self.key = os.environ.get("ENCRYPTION_KEY")
        if not self.key:
            # Anahtar yoksa, yeni bir anahtar oluştur ve kaydet
            self.key = Fernet.generate_key().decode()
            print(f"YENİ ŞİFRELEME ANAHTARI OLUŞTURULDU! Bunu güvenli bir yerde saklayın: {self.key}")
            
        # Fernet şifreleme nesnesi
        self.fernet = Fernet(self.key.encode() if isinstance(self.key, str) else self.key)
    
    def store_data(self, data: Dict[str, Any], session_id: str, ttl_days: int = 30) -> str:
        """

        Hassas verileri şifreleyerek saklar

        

        Args:

            data: Saklanacak veriler

            session_id: Benzersiz oturum kimliği

            ttl_days: Verilerin saklanacağı süre (gün)

            

        Returns:

            Dosya yolu

        """
        # Meta verileri ekle
        data_with_meta = {
            "data": data,
            "created_at": datetime.now().isoformat(),
            "expires_at": (datetime.now() + timedelta(days=ttl_days)).isoformat(),
            "session_id": session_id
        }
        
        # JSON'a dönüştür ve şifrele
        json_data = json.dumps(data_with_meta)
        encrypted_data = self.fernet.encrypt(json_data.encode())
        
        # Dosyaya kaydet
        file_path = os.path.join(self.storage_dir, f"{session_id}.enc")
        with open(file_path, "wb") as f:
            f.write(encrypted_data)
        
        return file_path
    
    def retrieve_data(self, session_id: str) -> Optional[Dict[str, Any]]:
        """

        Şifreli verileri getirir ve çözer

        

        Args:

            session_id: Benzersiz oturum kimliği

            

        Returns:

            Çözülmüş veriler veya None (eğer yoksa)

        """
        file_path = os.path.join(self.storage_dir, f"{session_id}.enc")
        
        if not os.path.exists(file_path):
            return None
        
        try:
            # Şifreli veriyi oku
            with open(file_path, "rb") as f:
                encrypted_data = f.read()
            
            # Şifreyi çöz
            decrypted_data = self.fernet.decrypt(encrypted_data).decode()
            data_with_meta = json.loads(decrypted_data)
            
            # Süre kontrolü
            expires_at = datetime.fromisoformat(data_with_meta["expires_at"])
            if datetime.now() > expires_at:
                # Süresi dolmuş veriler
                os.remove(file_path)  # Dosyayı sil
                return None
                
            return data_with_meta["data"]
            
        except Exception as e:
            print(f"Veri çözme hatası: {str(e)}")
            return None
    
    def delete_data(self, session_id: str) -> bool:
        """

        Şifreli verileri siler

        

        Args:

            session_id: Benzersiz oturum kimliği

            

        Returns:

            Başarılı olup olmadığı

        """
        file_path = os.path.join(self.storage_dir, f"{session_id}.enc")
        
        if os.path.exists(file_path):
            os.remove(file_path)
            return True
        
        return False