Secret Redactor: ocultar segredos no Claude Code em prompts e saídas de ferramentas
Troca chaves, e-mails e IPs públicos por marcadores antes de o Claude vê-los e os restaura quando uma ferramenta roda.
Permissões
- Intercepta chamadas de ferramentasVê cada chamada de ferramenta que o Claude faz (tool.call / tool.check) e pode bloqueá-la ou alterá-la.
- Lê seus promptsPode ver o que você digita e a transcrição da conversa (prompt.* / session.append / session.messages).
- Altera a interfaceDesenha na interface do Claude Code: faixas, painéis, texto de status, notificações (ui.render / $.ui.*).
- testado com
- v2.1.291
- último teste
- requer
- Claude Code ≥ 2.1.287
- superfícies
- notificação
- código-fonte
- Ray Amjad (ray-amjad) (MIT)
Instale dentro do Claude Code:
/plugin install secret-redactor --marketplace ray-amjad/awesome-claude-code-function-hooksO que este mod faz?
O Secret Redactor é um mod da comunidade de Ray Amjad (ray-amjad), um dos plugins da coleção awesome-claude-code-function-hooks. Serve para ocultar segredos no Claude Code por três caminhos: o que você digita, o que uma ferramenta lê de volta e os blocos de contexto anexados à primeira mensagem. Cada segredo, endereço de e-mail ou endereço IP público é trocado por um marcador como [REDACTED-SECRET-164d0c98] antes de o modelo vê-lo.
O valor não é destruído. O mesmo valor sempre recebe o mesmo marcador, então o Claude ainda distingue um cliente ou uma chave de outra. Quando o Claude chama uma ferramenta depois, o hook restaura os marcadores, e um comando Bash ou um Write leva o valor real. Um cat .env mostra os marcadores ao Claude, e um comando posterior que os use continua funcionando.
Ele oculta chaves no formato de um fornecedor (sk-ant-, ghp_, AKIA, sk_live_, JWTs, webhooks do Slack e do Discord, blocos de chave privada, a senha de uma string de conexão), tokens de alta entropia, endereços de e-mail e endereços IP. Faixas de IP privadas como 127.x, 10.x e 192.168.x continuam visíveis por padrão. Ids de objetos do Stripe como price_ e prod_ são tratados como públicos. Segundo o README do autor, é preciso ativar os hooks de função; é a primeira coisa a conferir se parecer que nada acontece.
Demonstração
A gravação inicia o Claude Code com o mod carregado no pequeno projeto de demonstração, com os hooks de função ativados. Digitamos um prompt com a chave de teste do autor, de test/fixtures/sample.env (não são credenciais reais), e um e-mail de exemplo, e pressionamos Enter. O prompt enviado aparece na transcrição como KEY=[REDACTED-SECRET-164d0c98] mail [REDACTED-EMAIL-6f096ff7], e à direita do rodapé surge um aviso: secret-redactor: hid 2 value(s) from the prompt. O clipe termina enquanto o Claude ainda trabalha; não gravamos a resposta dele.
Instalação
Use qualquer um dos métodos do bloco de instalação; eles instalam direto do marketplace do próprio autor. Depois ative os hooks de função: adicione "env": { "CLAUDE_CODE_ENABLE_FUNCTION_HOOKS": "1" } a ~/.claude/settings.json, ou inicie uma sessão com CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 claude. Para testar sem instalar, clone o repositório e execute claude --plugin-dir ./awesome-claude-code-function-hooks/plugins/secret-redactor.
$ install secret-redactor
Requer Claude Code ≥ 2.1.287
Instala a partir do marketplace do autor: ray-amjad/awesome-claude-code-function-hooks
1.Uma linha, dentro do Claude Code
/plugin install secret-redactor --marketplace ray-amjad/awesome-claude-code-function-hooksCole em uma sessão em andamento (v2.1.275+). O Claude Code pede primeiro para adicionar o marketplace.
2.Pelo seu shell
claude plugin marketplace add ray-amjad/awesome-claude-code-function-hooks claude plugin install secret-redactor@awesome-claude-code-function-hooksDepois execute /reload-plugins em qualquer sessão que já esteja aberta.
3.Experimente sem instalar
git clone https://github.com/ray-amjad/awesome-claude-code-function-hooks claude --plugin-dir ./awesome-claude-code-function-hooks/plugins/secret-redactorCarrega o mod só para uma sessão. Nada é adicionado às suas configurações.
Como funciona
O módulo de hooks é um único arquivo, hooks/redact.ts. Um cofre no nível do módulo guarda dois mapas, e o marcador é o tipo mais um hash FNV-1a do 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 limpa o texto que você digita e mostra o aviso. tool.call primeiro restaura os marcadores na entrada da ferramenta, deixa a ferramenta rodar com await next(input), limpa o resultado e coloca uma contagem na linha da ferramenta. prompt.context limpa segredos, mas não e-mails, nos blocos anexados à primeira mensagem.
Um valor é um segredo se corresponder a um padrão de fornecedor, se for um token de 24 caracteres ou mais com maiúsculas, minúsculas e dígitos acima de 3,6 bits por caractere, ou se um token mais curto acima de 3,0 bits vier depois de um nome como API_KEY=, "token": ou Bearer. Regras para palavras, nomes em camelCase, alfabetos e hexadecimal puro impedem que SHAs do git e identificadores sejam ocultados.
Personalize
O plugin declara doze opções, que você pode mudar em /config ou em pluginConfigs nas suas configurações de usuário:
secrets,pii: desligam cada classe.restoreInToolInputs: deixa de colocar os valores reais de volta antes de uma ferramenta rodar.notify: desliga o aviso e a contagem na linha da ferramenta.minEntropy(3.6),minLength(24),contextMinEntropy(3.0): aumente para ocultar menos.redactPrivateIps: oculta também127.x,10.x,192.168.xe outras faixas reservadas.allow,allowEmails,allowPrefixes,denyPrefixes: exceções e acréscimos separados por vírgula.
Permissões e segurança
Lemos todos os arquivos que o plugin pode executar antes de rodá-lo: plugin.json, hooks/hooks.json, hooks/redact.ts (o único módulo, sem imports além de tipos), o teste e o fixture. Não há package.json, script de instalação, binário nem código empacotado.
- Rede, comandos, arquivos, ambiente: nenhum. O módulo não chama
$.http,$.process,$.fsnem$.env, e não usa$.storeou$.state. O cofre vive na memória do módulo e morre com a sessão. As únicas chamadas de API são$.ui.toaste$.ui.notice. - Intercepta chamadas de ferramentas e lê seus prompts. É o objetivo do mod e bate com o README. Ele reescreve seu prompt, as entradas das ferramentas (marcador para valor real) e os resultados delas (valor para marcador). Nunca nega uma chamada.
- Restaurar é uma capacidade. Qualquer marcador na entrada de uma ferramenta é trocado pelo valor real, seja qual for o comando. Se um resultado de ferramenta trouxer instruções injetadas, o Claude poderia ser convencido a colocar um marcador num comando
curl, e a chave real seria enviada. DesliguerestoreInToolInputsse isso o preocupa, ao custo de as ferramentas receberem o texto do marcador. - Marcadores não são secretos. O hash é um FNV-1a de 32 bits, então o marcador de um valor de baixa entropia, como um e-mail ou um IP, pode ser adivinhado calculando hashes de candidatos. Ele oculta o valor do contexto do modelo, não de quem já pode testar palpites. Em teoria, dois valores podem ter o mesmo hash.
- As heurísticas deixam passar coisas. As regras de entropia podem deixar um segredo visível ou ocultar um token inofensivo. Ele não analisa o que o modelo escreve e não sobrevive a uma reinicialização.
- Sem telemetria e sem instruções injetadas. Ele não acrescenta aos prompts nenhum texto próprio além dos marcadores.
- Licença: MIT, com arquivo LICENSE no repositório.
O claude plugin validate não relatou erros nem avisos, mas as notas apontam dois hooks de bloqueio sem .catch (prompt.submit e tool.call). Se o hook lançar uma exceção, não há proteção de reserva, então um bug no hook poderia fazer o prompt ou a chamada falhar em vez de passar direto. O claude plugin test não encontrou nada para executar, porque o teste do autor é test/detect.test.mts (um script Node comum) e não um arquivo *.test.ts. Não o executamos.
- Intercepta chamadas de ferramentas
- Vê cada chamada de ferramenta que o Claude faz (tool.call / tool.check) e pode bloqueá-la ou alterá-la.
- Lê seus prompts
- Pode ver o que você digita e a transcrição da conversa (prompt.* / session.append / session.messages).
- Altera a interface
- Desenha na interface do Claude Code: faixas, painéis, texto de status, notificações (ui.render / $.ui.*).
Compatibilidade e solução de problemas
Verificado com o Claude Code 2.1.291 no macOS: o validate passou e a demonstração rodou com o plugin carregado. Se nada for ocultado:
- Os hooks de função estão ativos:
CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1nas configurações ou no shell que inicia o Claude Code. - Depois de instalar em uma sessão que já está aberta, execute
/reload-plugins. - O valor está na lista de exceções: domínios de documentação como
@example.com, endereçosnoreply@, faixas de IP privadas e ids de objetos do Stripe são deixados de lado de propósito. - Na caixa de entrada você vê seu texto como digitou; os marcadores aparecem depois que o prompt é enviado.
Perguntas frequentes
- O Secret Redactor envia meus segredos para algum lugar?
- Não. No código não encontramos chamadas de rede, comandos de shell nem acesso a arquivos. Os valores reais ficam em um mapa na memória do módulo de hooks e somem quando a sessão termina.
- Por que nada é ocultado depois de instalar?
- Segundo o README do autor, é um hook de função e não faz nada enquanto os hooks de função não estiverem ativados. Defina CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 no bloco env de ~/.claude/settings.json, ou inicie uma sessão com essa variável.
- O Claude ainda consegue usar uma chave que não vê?
- Sim, nas entradas das ferramentas. Antes de uma ferramenta rodar, o hook troca um marcador como [REDACTED-SECRET-164d0c98] pelo valor real, então um comando Bash ou um Write leva a chave real. O modelo só vê o marcador.
- Ele oculta um segredo que o próprio Claude escreve?
- Não. Só o que o Claude lê é analisado: seu prompt, os resultados das ferramentas e os blocos anexados à primeira mensagem. Uma chave que o modelo escreve em um comando é uma chave que ele já tinha.
- Como evito que valores que quero ver sejam ocultados?
- Use as opções em /config. allow aceita strings exatas, allowEmails aceita endereços ou um domínio como @yourdomain.com, allowPrefixes marca prefixos de id extras como públicos, e aumentar minEntropy oculta menos.
# Mods relacionados
DestaqueBloquear comandos perigosos
Recusa rm -rf /, force-push na main, DROP TABLE, curl | sh e outros comandos Bash destrutivos antes de rodarem.
- notificação
- Intercepta chamadas de ferramentas
- Altera a interface
testado com v2.1.310
DestaqueContador de chamadas de ferramentas
Conta as chamadas de ferramentas do Claude por turno e por sessão, mostra o total junto ao spinner e adiciona /tally.
- spinner
- transcrição
- status
- Intercepta chamadas de ferramentas
- Altera a interface
- Adiciona comandos/ferramentas
testado com v2.1.310
Mais em Proteções de segurança, Ferramentas que você adiciona ao Claude.