aboutsummaryrefslogtreecommitdiff
path: root/modules/core/secret-vault.js
diff options
context:
space:
mode:
authorAgando <roduccomm@gmail.com>2026-06-18 06:00:40 +0200
committerAgando <roduccomm@gmail.com>2026-06-18 06:00:40 +0200
commitfba6df22dae297c89fa0df065628dddded66c69c (patch)
treef954a04ee1effe56361282a16444deaa93bd0151 /modules/core/secret-vault.js
parenta02db2f506dec15c0c89dd4f8f21f975f627e4fe (diff)
auto: 2026-06-18_06:00 changes
Diffstat (limited to 'modules/core/secret-vault.js')
-rw-r--r--modules/core/secret-vault.js32
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,