Các khóa mật mã (khóa đồng thuận, khóa danh tính, khóa mã hóa) được sao lưu tự động sau mỗi sự kiện tạo mới hoặc xoay vòng khóa. Mỗi bản sao lưu được mã hóa bằng AES-256-GCM và được phân phối đến nhiều vị trí kho lưu trữ (vault). Khi khôi phục, restore_keys() sẽ xác thực tính toàn vẹn bằng SHA-512 trước khi giải mã và áp dụng các khóa vào hệ thống.
Đặc tính quan trọng: Ngay cả khi một kho lưu trữ bị xâm nhập, các khóa văn bản thô (plaintext keys) vẫn được bảo vệ bằng AES-256-GCM. Ngay cả khi bản mã (ciphertext) bị thay đổi, việc kiểm tra tính toàn vẹn SHA-512 sẽ ngăn chặn giải mã dữ liệu bị hỏng.
Sơ đồ Luồng — Sao lưu
sequenceDiagram
autonumber
participant Trigger as ⚙️ Tạo / Xoay vòng Khóa
participant KBM as 🔑 KeyBackupManager
participant AES as 🔐 AES-256-GCM
participant FS as 📁 Hệ thống Tệp / Kho lưu trữ
Note over Trigger: Khóa mới được tạo (cấp chứng chỉ MSP, xoay vòng đồng thuận)
Trigger->>KBM: backup_keys(public_key, private_key, key_type)
KBM->>KBM: Chuẩn hóa key_type → backup_id = "{key_type}_{timestamp}"
rect rgb(0, 0, 0, 0)
Note over KBM,AES: Giai đoạn 1 — Mã hóa
KBM->>AES: _encrypt_backup_data({ public_key, private_key, ... }, encryption_key)
Note right of AES: nonce = secrets.token_bytes(12)<br/>ciphertext = AESGCM.encrypt(nonce, json_data, aad)<br/>output = nonce || ciphertext
AES-->>KBM: encrypted_data (bytes)
end
rect rgb(0, 0, 0, 0)
Note over KBM,FS: Giai đoạn 2 — Ghi & Xác thực Tính Toàn vẹn
KBM->>FS: ghi {backup_id}.enc vào kho lưu trữ chính
KBM->>KBM: _calculate_integrity_hash(encrypted_data) → SHA-512
KBM->>KBM: _verify_integrity(backup_file, expected_hash) → xác nhận ghi OK
end
rect rgb(0, 0, 0, 0)
Note over KBM,FS: Giai đoạn 3 — Phân phối & Siêu dữ liệu
KBM->>FS: _distribute_to_locations(file, backup_id, locations)
Note right of FS: Sao chép sang kho phụ, kho thứ ba, ...<br/>Mỗi kho = một thư mục riêng biệt / đường dẫn từ xa
FS-->>KBM: distributed_locations []
KBM->>KBM: _update_metadata(backup_id, { timestamp, key_type, hash, locations, file_path })
KBM->>KBM: _cleanup_old_backups() — xóa bản sao lưu cũ hơn retention_period ngày
end
KBM-->>Trigger: backup_id ✅
Sơ đồ Luồng — Khôi phục
sequenceDiagram
autonumber
participant Trigger as ⚙️ Khắc phục Thảm họa
participant KBM as 🔑 KeyBackupManager
participant AES as 🔐 AES-256-GCM
participant FS as 📁 Hệ thống Tệp / Kho lưu trữ
Trigger->>KBM: restore_keys(backup_id)
rect rgb(0, 0, 0, 0)
Note over KBM,FS: Giai đoạn 1 — Định vị & Kiểm tra Tính Toàn vẹn
KBM->>FS: _find_backup_file(backup_id)<br/>Tìm kiếm ở kho chính, sau đó đến các kho phân phối
FS-->>KBM: đường dẫn backup_file
KBM->>KBM: _get_backup_hash(backup_id) → expected_hash từ metadata
KBM->>KBM: _calculate_integrity_hash(file_content) → actual_hash
end
alt Tính toàn vẹn OK (actual == expected)
KBM->>AES: _decrypt_backup_data(encrypted_data, encryption_key)
AES-->>KBM: { public_key, private_key, key_type }
KBM->>KBM: _validate_keys(public_key, private_key, key_type)
KBM->>KBM: _apply_restored_keys(public_key, private_key, key_type)
KBM-->>Trigger: { public_key, private_key } ✅
else Tính toàn vẹn THẤT BẠI (bị thay đổi hoặc lỗi)
KBM-->>Trigger: báo lỗi IntegrityError ❌
Note over KBM: Ghi log lỗi dữ liệu, thử vị trí kho tiếp theo
end
Cơ chế Dự phòng Đa Kho (Multi-Vault Failover)
flowchart LR
RESTORE["restore_keys(backup_id)"]
V1["📁 Kho chính\n_find_backup_file()"]
V2["📁 Kho phụ\n(dự phòng)"]
V3["📁 Kho thứ ba\n(dự phòng)"]
OK["✅ Khóa được giải mã"]
ERR["❌ IntegrityError\nTất cả các kho đều thất bại"]
RESTORE --> V1
V1 -->|Tìm thấy + nguyên vẹn| OK
V1 -->|Không tìm thấy / bị lỗi| V2
V2 -->|Tìm thấy + nguyên vẹn| OK
V2 -->|Không tìm thấy / bị lỗi| V3
V3 -->|Tìm thấy + nguyên vẹn| OK
V3 -->|Không tìm thấy / bị lỗi| ERR
Chi tiết Từng Bước
Bước
Mô tả
1. Kích hoạt
Khóa được tạo (cấp chứng chỉ MSP) hoặc xoay vòng (theo lịch trình)