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.

This commit is contained in:
Torsten Schulz (local)
2025-12-18 13:12:02 +01:00
parent 10499e0249
commit a004ffba9b

View File

@@ -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)
// 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)
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++
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)
// 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)
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++
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++