// ============================================================ // safe-storage-ipc — safeStorage 加密/解密 IPC 处理器 // // 在主进程注册,渲染进程通过 preload 暴露的安全方法调用。 // 加密后的数据为 Base64 字符串,方便存储在 localStorage。 // // 平台对应: // Windows → DPAPI // macOS → Keychain // Linux → libsecret // // 注意: // - safeStorage 加密绑定当前 OS 用户账户,无法跨用户/跨设备解密 // - 用户重装 OS 后加密数据将无法恢复(需重新登录) // - safeStorage.isEncryptionAvailable() 在部分 Linux 发行版可能返回 false // ============================================================ import { ipcMain, safeStorage } from 'electron'; import { BIDIRECTIONAL_STORAGE } from '../../../shared/constants/ipc/storage'; import { logger } from '../logger'; /** 检查 safeStorage 是否可用,不可用时记录警告 */ function checkAvailability(): boolean { if (!safeStorage.isEncryptionAvailable()) { logger.warn('safe-storage', 'safeStorage 加密不可用(可能缺少 libsecret 等系统密钥服务)'); return false; } return true; } /** * 注册 safeStorage IPC 处理器 * 在 app.whenReady() 中调用 */ export function registerSafeStorageIpcHandlers(): void { // ---------- 加密 ---------- ipcMain.handle(BIDIRECTIONAL_STORAGE.SAFESTORAGE_ENCRYPT, (_event, plaintext: string) => { if (typeof plaintext !== 'string' || plaintext.length === 0) { logger.warn('safe-storage', '加密参数无效'); return { success: false, error: '参数无效:需要非空字符串' }; } if (!checkAvailability()) { return { success: false, error: 'safeStorage 不可用' }; } try { const encrypted = safeStorage.encryptString(plaintext); const base64 = encrypted.toString('base64'); return { success: true, data: base64 }; } catch (err) { const message = err instanceof Error ? err.message : String(err); logger.error('safe-storage', '加密失败', err instanceof Error ? err : new Error(message)); return { success: false, error: message }; } }); // ---------- 解密 ---------- ipcMain.handle(BIDIRECTIONAL_STORAGE.SAFESTORAGE_DECRYPT, (_event, encryptedBase64: string) => { if (typeof encryptedBase64 !== 'string' || encryptedBase64.length === 0) { logger.warn('safe-storage', '解密参数无效'); return { success: false, error: '参数无效:需要非空字符串' }; } if (!checkAvailability()) { return { success: false, error: 'safeStorage 不可用' }; } try { const buffer = Buffer.from(encryptedBase64, 'base64'); const plaintext = safeStorage.decryptString(buffer); return { success: true, data: plaintext }; } catch (err) { const message = err instanceof Error ? err.message : String(err); logger.error('safe-storage', '解密失败', err instanceof Error ? err : new Error(message)); return { success: false, error: message }; } }); logger.info('safe-storage', 'safeStorage IPC 处理器已注册'); }