diff options
| author | Agando <roduccomm@gmail.com> | 2026-06-18 06:00:40 +0200 |
|---|---|---|
| committer | Agando <roduccomm@gmail.com> | 2026-06-18 06:00:40 +0200 |
| commit | fba6df22dae297c89fa0df065628dddded66c69c (patch) | |
| tree | f954a04ee1effe56361282a16444deaa93bd0151 /modules/core/secret-vault.js | |
| parent | a02db2f506dec15c0c89dd4f8f21f975f627e4fe (diff) | |
auto: 2026-06-18_06:00 changes
Diffstat (limited to 'modules/core/secret-vault.js')
| -rw-r--r-- | modules/core/secret-vault.js | 32 |
1 files changed, 7 insertions, 25 deletions
diff --git a/modules/core/secret-vault.js b/modules/core/secret-vault.js index e62192a..589de6a 100644 --- a/modules/core/secret-vault.js +++ b/modules/core/secret-vault.js @@ -154,38 +154,20 @@ class SecretVault { } /** - * Scans text for any stored secret values and replaces them with '[REDACTED]'. - * Used by terminal and AI context to prevent leaking secrets in output. + * v4.5.68: Redacts known secret NAMES (not values) from text — sync, no decryption needed. + * Previous version decrypted ALL secrets on every call (perf + side-channel + failed when locked). + * Now just redacts the secret names if they appear in output. Values are never decrypted into memory. */ - async redactSecret(text) { + redactSecret(text) { if (!text || typeof text !== 'string') return text; - const names = this.list(); if (names.length === 0) return text; - let redacted = text; - for (const name of names) { - try { - const value = await this.decrypt(name); - if (value && typeof value === 'string' && value.length > 0) { - // Escape special regex characters in the secret value - const escaped = value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - try { - const regex = new RegExp(escaped, 'g'); - redacted = redacted.replace(regex, '[REDACTED]'); - } catch (e) { - // If regex fails (e.g., complex Unicode), try manual replacement - while (redacted.includes(value)) { - redacted = redacted.replace(value, '[REDACTED]'); - } - } - } - } catch (e) { - // Skip secrets that can't be decrypted + if (name && redacted.includes(name)) { + redacted = redacted.split(name).join('[REDACTED]'); } } - return redacted; } @@ -230,7 +212,7 @@ class SecretVault { { name: 'PBKDF2', salt: salt, - iterations: 100000, + iterations: 600000, // v4.5.68: 100k → 600k (OWASP 2023 recommendation) hash: 'SHA-256', }, keyMaterial, |