Salvaguarda: ocultar chaves de API e palavras-passe
# Salvaguarda: ocultar chaves de API e palavras-passe code: 1srd0yo | type: guardrail | language: pt | licence: MIT | version: v1 description: Salvaguarda que oculta chaves de API, tokens, palavras-passe, chaves privadas e cadeias de ligação antes de enviar um texto, um ficheiro ou uma exportação a uma IA. Regras, 14 casos de teste, código. page: https://contextetech.com/pt/salvaguardas/ocultar-segredos-chaves-api-1srd0yo mcp: connect https://contextetech.com/mcp then call load_resource with code "1srd0yo" (or ask "load 1srd0yo") json: https://contextetech.com/api/resources/contextetech--ocultar-segredos-chaves-api python: pip install contexte && contexte get 1srd0yo citation (required by the licence): contextetech. (2026). Salvaguarda: ocultar chaves de API e palavras-passe (Version 1) [Salvaguarda]. Contexte Tech. https://contextetech.com/pt/salvaguardas/ocultar-segredos-chaves-api-1srd0yo
Salvaguarda que oculta chaves de API, tokens, palavras-passe, chaves privadas e cadeias de ligação antes de enviar um texto, um ficheiro ou uma exportação a uma IA. Regras, 14 casos de teste, código.
Regras
Ocultar antes de enviar à IA qualquer segredo que dê acesso a uma conta ou a um serviço: - chaves de API (OpenAI, Anthropic, Mistral, Stripe, AWS…) e tokens de acesso (GitHub, JWT); - palavras-passe escritas em claro (senha=…, password: …); - chaves privadas (-----BEGIN … PRIVATE KEY-----); - credenciais dentro de um endereço (postgres://utilizador:senha@servidor). Deixar passar: valores de exemplo (SUA_CHAVE_API, xxx, <chave>), endereços sem credenciais, números de encomenda ou de commit, textos sobre palavras-passe que não contêm nenhuma. Aplicar antes de colar um ficheiro .env, uma exportação da base de dados ou registos num assistente.
Casos de teste
| Entrada | Esperado |
|---|---|
| AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE | Bloquear |
| token: ghp_000000000000000000000000000000000000 | Bloquear |
| ANTHROPIC_API_KEY=sk-ant-00000000000000000000000000000000 | Bloquear |
| STRIPE_SECRET=sk_live_0000000000000000000000 | Bloquear |
| DATABASE_URL=postgres://admin:S3cretPass@db.internal:5432/app | Bloquear |
| -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA0000000000000000 -----END RSA PRIVATE KEY----- | Bloquear |
| Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwMDAwMDAifQ.0000000000000000000000 | Bloquear |
| senha = Verao2026! | Bloquear |
| A palavra-passe deve ter pelo menos 12 caracteres. | Permitir |
| Substitua SUA_CHAVE_API pela chave da sua conta. | Permitir |
| A documentação está em https://docs.exemplo.pt/api. | Permitir |
| O commit a1b2c3d corrige o erro de início de sessão. | Permitir |
| Encomenda n.º 2026-10-458712 expedida. | Permitir |
| Inicie sessão com a sua conta habitual. | Permitir |
Código
import re
PATTERNS = {
"private_key": r"-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----",
"aws_key": r"\bAKIA[0-9A-Z]{16}\b",
"github_token": r"\bgh[pousr]_[A-Za-z0-9]{36,}\b",
"llm_api_key": r"\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{20,}\b",
"stripe_key": r"\b[sr]k_(?:live|test)_[A-Za-z0-9]{16,}\b",
"jwt": r"\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b",
"url_credentials": r"\b[a-z][a-z0-9+.-]*://[^\s:/@]+:[^\s@/]+@",
"password_assignment": r"(?i)\b(?:password|passwd|pwd|secret|api_?key|token|palavra_passe|senha)\s*[:=]\s*[\"']?[^\s\"']{6,}",
}
PLACEHOLDERS = ("xxx", "...", "<", "your", "sua_", "example_value")
def mask_secrets(text: str) -> tuple[str, bool]:
"""Substitui os segredos por [tipo oculto]; devolve o texto e True se algo foi ocultado."""
found = False
for name, pattern in PATTERNS.items():
def repl(m):
nonlocal found
if any(p in m.group(0).lower() for p in PLACEHOLDERS):
return m.group(0)
found = True
return f"[{name} oculto]"
text = re.sub(pattern, repl, text)
return text, found- Identificador
- contextetech--ocultar-segredos-chaves-api
- Ficheiro
- ocultar-segredos-chaves-api.guardrail.json
- Formato
- JSON (application/json)
- Tamanho
- 2.648 bytes (2,6 KB)
- Codificação
- UTF-8
- Tokens estimados
- ≈ 727
- Utilização comercial
- Permitida
- Dados pessoais
- Nenhum
- Versão
- 1.0
- Publicado em
- 10 de outubro de 2026 às 04:24
- Atualizado em
- 16 de outubro de 2026 às 23:20
- Armazenamento
- na base de dados
Estatísticas
Gostos : 0 · Comentários : 0
Clique num contador para o mostrar ou ocultar, passe o rato sobre o gráfico para ver os detalhes. Uma visualização por visitante por dia, sem robôs; contagem iniciada a 30 de setembro de 2026.
Custo estimado
- Tokens de entrada por chamada
- ≈ 1.067
| Modelo | Por chamada | Por mês |
|---|---|---|
| GPT-6 Luna · OpenAImelhor preço | € 0,00009 | € 0,09 |
| DeepSeek Flash · DeepSeek | € 0,00028 | € 0,28 |
| Mistral Large · Mistral AI | € 0,00047 | € 0,47 |
| DeepSeek V4 Pro · DeepSeek | € 0,00124 | € 1,24 |
| GPT-6 Sol · OpenAI | € 0,00188 | € 1,88 |
| Claude Sonnet 5.5 · Anthropic | € 0,00188 | € 1,88 |
| Claude Opus 5.5 · Anthropic | € 0,00376 | € 3,76 |
| Modelo open source alojado por si (Ollama, vLLM) | 0 € em custos de API (apenas o custo do servidor) | |
Apenas o custo de entrada, sem a resposta do modelo. Preços públicos padrão dos fornecedores (Mistral AI, DeepSeek, OpenAI, Anthropic) convertidos de USD para euros à taxa do BCE de 13 de outubro de 2026. Estimativa: 1 token ≈ 3,6 caracteres.
Comum às 3 regiões
Criado pelo autor, sem fonte externa.
Utilização comercial permitida · citar o autor · alterações permitidas.
Apenas texto ou dados: sem acesso a ficheiros, à rede ou a comandos.
Alojado em França (Scaleway, Paris). Sem transferência para fora da UE.
União Europeia · 5/5
Sem dados pessoais.
Sem dados de treino: nenhum resumo exigido.
Estados Unidos · 5/5
Sem dados pessoais.
Sem dados de treino: nenhuma documentação a publicar.
China · 5/5
Sem dados pessoais.
Sem dados de treino; os conteúdos gerados por IA difundidos na China devem ser identificados (2025).
Resumo indicativo em 30/09/2026, sem valor de certificação jurídica. Método e fontes →
Qualidade do conteúdo
Os critérios detalhados estão reservados aos membros.
Cada critério, os pontos retirados e uma dica para corrigir cada um.
Análise do conteúdo
Os critérios detalhados estão reservados aos membros.
Cada critério, os pontos retirados e uma dica para corrigir cada um.
Calculado a partir do conteúdo da ficha, por regras, sem IA. A nota está no separador Qualidade.
MCP contexte
https://contextetech.com/mcp
carrega 1srd0yo
Adicione o endereço como conector nas definições das suas aplicações de IA e envie o pedido acima.
API
import json, urllib.request url = "https://contextetech.com/api/resources/contextetech--ocultar-segredos-chaves-api" fiche = json.load(urllib.request.urlopen(url)) print(fiche["title"] or fiche["name"])
ocultar-segredos-chaves-api.guardrail.json
{
"format": "contextetech/guardrail/v1",
"id": "contextetech/ocultar-segredos-chaves-api",
"description": "Salvaguarda que oculta chaves de API, tokens, palavras-passe, chaves privadas e cadeias de ligação antes de enviar um texto, um ficheiro ou uma exportação a uma IA. Regras, 14 casos de teste, código.",
"license": "MIT",
"language": "pt",
"type": "other",
"action": "mask",
"rules": "Ocultar antes de enviar à IA qualquer segredo que dê acesso a uma conta ou a um serviço:\n- chaves de API (OpenAI, Anthropic, Mistral, Stripe, AWS…) e tokens de acesso (GitHub, JWT);\n- palavras-passe escritas em claro (senha=…, password: …);\n- chaves privadas (-----BEGIN … PRIVATE KEY-----);\n- credenciais dentro de um endereço (postgres://utilizador:senha@servidor).\nDeixar passar: valores de exemplo (SUA_CHAVE_API, xxx, <chave>), endereços sem credenciais, números de encomenda ou de commit, textos sobre palavras-passe que não contêm nenhuma.\nAplicar antes de colar um ficheiro .env, uma exportação da base de dados ou registos num assistente.",
"cases": [
{
"input": "AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE",
"expected": "block"
},
{
"input": "token: ghp_000000000000000000000000000000000000",
"expected": "block"
},
{
"input": "ANTHROPIC_API_KEY=sk-ant-00000000000000000000000000000000",
"expected": "block"
},
{
"input": "STRIPE_SECRET=sk_live_0000000000000000000000",
"expected": "block"
},
{
"input": "DATABASE_URL=postgres://admin:S3cretPass@db.internal:5432/app",
"expected": "block"
},
{
"input": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA0000000000000000\n-----END RSA PRIVATE KEY-----",
"expected": "block"
},
{
"input": "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwMDAwMDAifQ.0000000000000000000000",
"expected": "block"
},
{
"input": "senha = Verao2026!",
"expected": "block"
},
{
"input": "A palavra-passe deve ter pelo menos 12 caracteres.",
"expected": "allow"
},
{
"input": "Substitua SUA_CHAVE_API pela chave da sua conta.",
"expected": "allow"
},
{
"input": "A documentação está em https://docs.exemplo.pt/api.",
"expected": "allow"
},
{
"input": "O commit a1b2c3d corrige o erro de início de sessão.",
"expected": "allow"
},
{
"input": "Encomenda n.º 2026-10-458712 expedida.",
"expected": "allow"
},
{
"input": "Inicie sessão com a sua conta habitual.",
"expected": "allow"
}
]
}Verificar um texto (Python)
import re
PATTERNS = {
"private_key": r"-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----",
"aws_key": r"\bAKIA[0-9A-Z]{16}\b",
"github_token": r"\bgh[pousr]_[A-Za-z0-9]{36,}\b",
"llm_api_key": r"\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{20,}\b",
"stripe_key": r"\b[sr]k_(?:live|test)_[A-Za-z0-9]{16,}\b",
"jwt": r"\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b",
"url_credentials": r"\b[a-z][a-z0-9+.-]*://[^\s:/@]+:[^\s@/]+@",
"password_assignment": r"(?i)\b(?:password|passwd|pwd|secret|api_?key|token|palavra_passe|senha)\s*[:=]\s*[\"']?[^\s\"']{6,}",
}
PLACEHOLDERS = ("xxx", "...", "<", "your", "sua_", "example_value")
def mask_secrets(text: str) -> tuple[str, bool]:
"""Substitui os segredos por [tipo oculto]; devolve o texto e True se algo foi ocultado."""
found = False
for name, pattern in PATTERNS.items():
def repl(m):
nonlocal found
if any(p in m.group(0).lower() for p in PLACEHOLDERS):
return m.group(0)
found = True
return f"[{name} oculto]"
text = re.sub(pattern, repl, text)
return text, found
Comunidade
Ainda não há comentários. Partilhe a sua experiência, vai ajudar a próxima pessoa.