Saltar al contenido
claudemods

Secret Redactor: ocultar secretos en Claude Code en prompts y salidas de herramientas

Cambia claves, correos e IP públicas por marcadores antes de que Claude los vea y los restaura en las herramientas.

Permisos

  • Intercepta llamadas a herramientasVe cada llamada a herramienta que hace Claude (tool.call / tool.check) y podría bloquearla o modificarla.
  • Lee tus promptsPuede ver lo que escribes y la transcripción de la conversación (prompt.* / session.append / session.messages).
  • Modifica la interfazDibuja en la interfaz de Claude Code: bandas, paneles, texto de estado, avisos (ui.render / $.ui.*).
probado con
v2.1.291
última prueba
requiere
Claude Code ≥ 2.1.287
superficies
aviso

Instalar dentro de Claude Code:

/plugin install secret-redactor --marketplace ray-amjad/awesome-claude-code-function-hooks
Todas las opciones de instalación ↓

¿Qué hace este mod?

Secret Redactor es un mod de la comunidad de Ray Amjad (ray-amjad), uno de los plugins de su colección awesome-claude-code-function-hooks. Sirve para ocultar secretos en Claude Code por tres vías: lo que escribes, lo que una herramienta lee de vuelta y los bloques de contexto adjuntos al primer mensaje. Cada secreto, dirección de correo o dirección IP pública se cambia por un marcador como [REDACTED-SECRET-164d0c98] antes de que el modelo lo vea.

El valor no se destruye. El mismo valor recibe siempre el mismo marcador, así que Claude sigue distinguiendo un cliente o una clave de otra. Cuando Claude llama después a una herramienta, el hook restaura los marcadores, y un comando Bash o un Write lleva el valor real. Un cat .env muestra a Claude los marcadores, y un comando posterior que los use sigue funcionando.

Oculta claves con formato de proveedor (sk-ant-, ghp_, AKIA, sk_live_, JWT, webhooks de Slack y Discord, bloques de clave privada, la contraseña de una cadena de conexión), tokens de alta entropía, direcciones de correo y direcciones IP. Los rangos IP privados como 127.x, 10.x y 192.168.x siguen visibles por defecto. Los ids de objetos de Stripe como price_ y prod_ se tratan como públicos. Según el README del autor, hay que activar los hooks de función; es lo primero que debes comprobar si parece que no pasa nada.

Demo

La grabación inicia Claude Code con el mod cargado en el pequeño proyecto de demostración, con los hooks de función activados. Escribimos un prompt con la clave de prueba del autor, de test/fixtures/sample.env (no son credenciales reales), y un correo de ejemplo, y pulsamos Enter. El prompt enviado aparece en la transcripción como KEY=[REDACTED-SECRET-164d0c98] mail [REDACTED-EMAIL-6f096ff7], y a la derecha del pie sale un aviso: secret-redactor: hid 2 value(s) from the prompt. El clip termina mientras Claude aún trabaja; no grabamos su respuesta.

Instalación

Usa cualquiera de los métodos del bloque de instalación; instalan directamente desde el marketplace del propio autor. Después activa los hooks de función: añade "env": { "CLAUDE_CODE_ENABLE_FUNCTION_HOOKS": "1" } a ~/.claude/settings.json, o inicia una sesión con CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 claude. Para probarlo sin instalar, clona el repositorio y ejecuta claude --plugin-dir ./awesome-claude-code-function-hooks/plugins/secret-redactor.

$ install secret-redactor

Requiere Claude Code ≥ 2.1.287

Se instala desde el marketplace del autor: ray-amjad/awesome-claude-code-function-hooks

  1. 1.Una línea, dentro de Claude Code

    /plugin install secret-redactor --marketplace ray-amjad/awesome-claude-code-function-hooks

    Pégala en una sesión abierta (v2.1.275+). Claude Code te pedirá primero añadir el marketplace.

  2. 2.Desde tu shell

    claude plugin marketplace add ray-amjad/awesome-claude-code-function-hooks
    claude plugin install secret-redactor@awesome-claude-code-function-hooks

    Después ejecuta /reload-plugins en cualquier sesión que ya esté abierta.

  3. 3.Pruébalo sin instalarlo

    git clone https://github.com/ray-amjad/awesome-claude-code-function-hooks
    claude --plugin-dir ./awesome-claude-code-function-hooks/plugins/secret-redactor

    Carga el mod solo para una sesión. No se añade nada a tu configuración.

Cómo funciona

El módulo de hooks es un único archivo, hooks/redact.ts. Una bóveda a nivel de módulo guarda dos mapas, y el marcador es el tipo más un hash FNV-1a del valor:

function mint(kind: Kind, value: string): string {
  hidden++
  const seen = byValue.get(value)
  if (seen) return seen
  const tag = `[REDACTED-${kind}-${fnv1a(value)}]`
  byValue.set(value, tag)
  byTag.set(tag, value)
  return tag
}

prompt.submit limpia el texto que escribes y muestra el aviso. tool.call primero restaura los marcadores en la entrada de la herramienta, deja que la herramienta se ejecute con await next(input), limpia el resultado y pone un recuento en la fila de la herramienta. prompt.context limpia secretos, pero no correos, en los bloques adjuntos al primer mensaje.

Un valor es un secreto si coincide con un patrón de proveedor, si es un token de 24 caracteres o más con mayúsculas, minúsculas y dígitos por encima de 3,6 bits por carácter, o si un token más corto por encima de 3,0 bits va detrás de un nombre como API_KEY=, "token": o Bearer. Las reglas para palabras, nombres en camelCase, alfabetos y hexadecimal puro evitan que se oculten SHA de git e identificadores.

Personalízalo

El plugin declara doce opciones, que puedes cambiar en /config o bajo pluginConfigs en tu configuración de usuario:

  • secrets, pii: desactivan cada clase.
  • restoreInToolInputs: deja de poner los valores reales antes de ejecutar una herramienta.
  • notify: desactiva el aviso y el recuento en la fila de la herramienta.
  • minEntropy (3.6), minLength (24), contextMinEntropy (3.0): súbelos para ocultar menos.
  • redactPrivateIps: oculta también 127.x, 10.x, 192.168.x y otros rangos reservados.
  • allow, allowEmails, allowPrefixes, denyPrefixes: excepciones y añadidos separados por comas.

Permisos y seguridad

Leímos todos los archivos que el plugin puede ejecutar antes de correrlo: plugin.json, hooks/hooks.json, hooks/redact.ts (el único módulo, sin imports salvo tipos), la prueba y el fixture. No hay package.json, script de instalación, binario ni código empaquetado.

  • Red, comandos, archivos, entorno: ninguno. El módulo no llama a $.http, $.process, $.fs ni $.env, y no usa $.store ni $.state. La bóveda vive en la memoria del módulo y muere con la sesión. Las únicas llamadas a la API son $.ui.toast y $.ui.notice.
  • Intercepta llamadas a herramientas y lee tus prompts. Es el objetivo del mod y coincide con el README. Reescribe tu prompt, las entradas de las herramientas (marcador a valor real) y sus resultados (valor a marcador). Nunca rechaza una llamada.
  • Restaurar es una capacidad. Cualquier marcador en la entrada de una herramienta se sustituye por el valor real, sea cual sea el comando. Si un resultado de herramienta trae instrucciones inyectadas, se podría convencer a Claude de poner un marcador en un comando curl, y la clave real se enviaría. Desactiva restoreInToolInputs si te preocupa, a costa de que las herramientas reciban el texto del marcador.
  • Los marcadores no son secretos. El hash es un FNV-1a de 32 bits, así que el marcador de un valor de baja entropía, como un correo o una IP, se puede adivinar calculando hashes de candidatos. Oculta el valor del contexto del modelo, no de quien ya puede probar suposiciones. Dos valores podrían, en teoría, compartir hash.
  • Las heurísticas fallan a veces. Las reglas de entropía pueden dejar visible un secreto u ocultar un token inofensivo. No analiza lo que escribe el modelo y no sobrevive a un reinicio.
  • Sin telemetría ni instrucciones inyectadas. No añade a los prompts más texto propio que los marcadores.
  • Licencia: MIT, con archivo LICENSE en el repositorio.

claude plugin validate no informó de errores ni avisos, pero sus notas señalan dos hooks bloqueantes sin .catch (prompt.submit y tool.call). Si el hook lanza una excepción, no hay protección de respaldo, así que un fallo en el hook podría hacer fallar el prompt o la llamada en lugar de dejarlos pasar. claude plugin test no encontró nada que ejecutar, porque la prueba del autor es test/detect.test.mts (un script de Node normal) y no un archivo *.test.ts. No la ejecutamos.

Intercepta llamadas a herramientas
Ve cada llamada a herramienta que hace Claude (tool.call / tool.check) y podría bloquearla o modificarla.
Lee tus prompts
Puede ver lo que escribes y la transcripción de la conversación (prompt.* / session.append / session.messages).
Modifica la interfaz
Dibuja en la interfaz de Claude Code: bandas, paneles, texto de estado, avisos (ui.render / $.ui.*).

Compatibilidad y solución de problemas

Comprobado con Claude Code 2.1.291 en macOS: validate pasó y la demo funcionó con el plugin cargado. Si no se oculta nada:

  • Los hooks de función están activos: CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 en tu configuración o en el shell que inicia Claude Code.
  • Tras instalarlo en una sesión que ya está abierta, ejecuta /reload-plugins.
  • El valor está en la lista de excepciones: dominios de documentación como @example.com, direcciones noreply@, rangos IP privados e ids de objetos de Stripe se dejan intactos a propósito.
  • En el cuadro de entrada ves tu texto tal como lo escribes; los marcadores aparecen cuando se envía el prompt.

Preguntas frecuentes

¿Secret Redactor envía mis secretos a algún sitio?
No. En el código no encontramos llamadas de red, comandos de shell ni acceso a archivos. Los valores reales están en un mapa en la memoria del módulo de hooks y desaparecen cuando termina la sesión.
¿Por qué no se oculta nada al instalarlo?
Según el README del autor, es un hook de función y no hace nada hasta activar los hooks de función. Pon CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 en el bloque env de ~/.claude/settings.json, o inicia una sesión con esa variable.
¿Puede Claude usar una clave que no ve?
Sí, en las entradas de las herramientas. Antes de que una herramienta se ejecute, el hook cambia un marcador como [REDACTED-SECRET-164d0c98] por el valor real, así que un comando Bash o un Write lleva la clave real. El modelo solo ve el marcador.
¿Oculta un secreto que escribe Claude mismo?
No. Solo se analiza lo que Claude lee: tu prompt, los resultados de las herramientas y los bloques adjuntos al primer mensaje. Una clave que el modelo escribe en un comando es una clave que ya tenía.
¿Cómo evito que oculte valores que quiero ver?
Usa las opciones de /config. allow acepta cadenas exactas, allowEmails acepta direcciones o un dominio como @yourdomain.com, allowPrefixes marca prefijos de id adicionales como públicos, y subir minEntropy oculta menos.
Bloquear comandos peligrosos funcionando en Claude CodeDestacado

Bloquear comandos peligrosos

Rechaza rm -rf /, force-push a main, DROP TABLE, curl | sh y otros comandos Bash destructivos antes de que se ejecuten.

  • aviso
  • Intercepta llamadas a herramientas
  • Modifica la interfaz

probado con v2.1.310

Contador de llamadas a herramientas funcionando en Claude CodeDestacado

Contador de llamadas a herramientas

Cuenta las llamadas a herramientas por turno y sesión, muestra el total junto al spinner y añade /tally con un desglose.

  • spinner
  • transcripción
  • estado
  • Intercepta llamadas a herramientas
  • Modifica la interfaz
  • Añade comandos/herramientas

probado con v2.1.310

Más en Protecciones de seguridad, Herramientas que añades a Claude.