From a004ffba9b36e50daa815aac747ebd267842b15d Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 18 Dec 2025 13:12:02 +0100 Subject: [PATCH] Implement checks for existing encryption with the new key in re-encryption scripts. Add functionality to skip re-encryption if data is already encrypted, enhancing efficiency and preventing redundant operations. --- scripts/re-encrypt-data.js | 87 +++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 20 deletions(-) diff --git a/scripts/re-encrypt-data.js b/scripts/re-encrypt-data.js index 3ef7242..8ae82d1 100755 --- a/scripts/re-encrypt-data.js +++ b/scripts/re-encrypt-data.js @@ -82,10 +82,25 @@ function isEncrypted(data) { } } +// Prüft ob Daten bereits mit dem neuen Schlüssel verschlüsselt sind +async function isEncryptedWithNewKey(encryptedData) { + try { + await decryptObject(encryptedData, NEW_KEY) + return true + } catch { + return false + } +} + // Versucht mit verschiedenen Schlüsseln zu entschlüsseln async function decryptWithFallback(encryptedData, keys) { const errors = [] + // Prüfe zuerst, ob die Daten bereits mit dem neuen Schlüssel verschlüsselt sind + if (await isEncryptedWithNewKey(encryptedData)) { + throw new Error('ALREADY_ENCRYPTED_WITH_NEW_KEY') + } + // encryptedData sollte bereits ein String sein (entweder direkt verschlüsselt oder aus einem JSON-Objekt extrahiert) // Versuche mit jedem Schlüssel zu entschlüsseln for (const key of keys) { @@ -115,6 +130,12 @@ async function reencryptUsers(backupDir, oldKeys) { return } + // Prüfe ob bereits mit neuem Schlüssel verschlüsselt + if (await isEncryptedWithNewKey(data)) { + console.log('ℹ️ users.json ist bereits mit dem neuen Schlüssel verschlüsselt, überspringe...') + return + } + console.log('🔄 Entschlüssele users.json...') const decrypted = await decryptWithFallback(data, oldKeys) @@ -129,6 +150,10 @@ async function reencryptUsers(backupDir, oldKeys) { console.log('ℹ️ users.json existiert nicht, überspringe...') return } + if (error.message === 'ALREADY_ENCRYPTED_WITH_NEW_KEY') { + console.log('ℹ️ users.json ist bereits mit dem neuen Schlüssel verschlüsselt, überspringe...') + return + } throw error } } @@ -147,6 +172,12 @@ async function reencryptMembers(backupDir, oldKeys) { return } + // Prüfe ob bereits mit neuem Schlüssel verschlüsselt + if (await isEncryptedWithNewKey(data)) { + console.log('ℹ️ members.json ist bereits mit dem neuen Schlüssel verschlüsselt, überspringe...') + return + } + console.log('🔄 Entschlüssele members.json...') const decrypted = await decryptWithFallback(data, oldKeys) @@ -161,6 +192,10 @@ async function reencryptMembers(backupDir, oldKeys) { console.log('ℹ️ members.json existiert nicht, überspringe...') return } + if (error.message === 'ALREADY_ENCRYPTED_WITH_NEW_KEY') { + console.log('ℹ️ members.json ist bereits mit dem neuen Schlüssel verschlüsselt, überspringe...') + return + } throw error } } @@ -197,28 +232,40 @@ async function reencryptMembershipApplications(backupDir, oldKeys) { // Prüfe ob encryptedData Feld vorhanden ist if (parsed.encryptedData) { - console.log(`🔄 Entschlüssele ${file}...`) - // Nur das encryptedData Feld entschlüsseln - const decrypted = await decryptWithFallback(parsed.encryptedData, oldKeys) - - console.log(`🔐 Verschlüssele ${file} mit neuem Schlüssel...`) - const reencrypted = encryptObject(decrypted, NEW_KEY) - - parsed.encryptedData = reencrypted - await fs.writeFile(filePath, JSON.stringify(parsed, null, 2), 'utf-8') - console.log(`✅ ${file} erfolgreich neu verschlüsselt`) - processed++ + // Prüfe ob bereits mit neuem Schlüssel verschlüsselt + if (await isEncryptedWithNewKey(parsed.encryptedData)) { + console.log(`ℹ️ ${file} ist bereits mit dem neuen Schlüssel verschlüsselt, überspringe...`) + skipped++ + } else { + console.log(`🔄 Entschlüssele ${file}...`) + // Nur das encryptedData Feld entschlüsseln + const decrypted = await decryptWithFallback(parsed.encryptedData, oldKeys) + + console.log(`🔐 Verschlüssele ${file} mit neuem Schlüssel...`) + const reencrypted = encryptObject(decrypted, NEW_KEY) + + parsed.encryptedData = reencrypted + await fs.writeFile(filePath, JSON.stringify(parsed, null, 2), 'utf-8') + console.log(`✅ ${file} erfolgreich neu verschlüsselt`) + processed++ + } } else if (file.endsWith('.data')) { // .data Dateien sind direkt verschlüsselt - console.log(`🔄 Entschlüssele ${file}...`) - const decrypted = await decryptWithFallback(content, oldKeys) - - console.log(`🔐 Verschlüssele ${file} mit neuem Schlüssel...`) - const reencrypted = encrypt(JSON.stringify(decrypted), NEW_KEY) - - await fs.writeFile(filePath, reencrypted, 'utf-8') - console.log(`✅ ${file} erfolgreich neu verschlüsselt`) - processed++ + // Prüfe ob bereits mit neuem Schlüssel verschlüsselt + if (await isEncryptedWithNewKey(content)) { + console.log(`ℹ️ ${file} ist bereits mit dem neuen Schlüssel verschlüsselt, überspringe...`) + skipped++ + } else { + console.log(`🔄 Entschlüssele ${file}...`) + const decrypted = await decryptWithFallback(content, oldKeys) + + console.log(`🔐 Verschlüssele ${file} mit neuem Schlüssel...`) + const reencrypted = encrypt(JSON.stringify(decrypted), NEW_KEY) + + await fs.writeFile(filePath, reencrypted, 'utf-8') + console.log(`✅ ${file} erfolgreich neu verschlüsselt`) + processed++ + } } else { console.log(`ℹ️ ${file} enthält keine verschlüsselten Daten, überspringe...`) skipped++