Repository navigation
[Plugin] 敏感凭据自动脱敏插件 (plugin/redact) #28
Copy link
Copy link
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
[Plugin] 敏感凭据自动脱敏插件 (plugin/redact)
做一个插件,让大模型在对话中永远看不到真实密钥,但知道「这里原本有某个类别的敏感内容」。
它会做什么
- 用户发送的消息里如果包含密钥,存进数据库和发给模型之前,先变成占位符。
- 工具(如
read .env、bash env、grep TOKEN)跑完后的结果里如果有密钥,写进时间线之前变成占位符。 - 每次调用大模型前,再检查一遍系统提示、历史消息和这轮的工具参数,把漏掉的密钥也换成占位符。
- 只做替换,不拦截任何工具。
read .env仍然会成功返回,但大模型看到的内容是:API_KEY=«REDACTED:assignment:abcd» - 同一个真实密钥出现多次,会换成同一个占位符,这样大模型还能说「用刚才那个 key」。
它不会做什么
- 不阻止工具执行,不报错,不审批。
- 不删除磁盘上的文件或工具产生的临时文件;只处理已经拿到门口准备进模型的数据。
- 不扫描图片的二进制数据。
- 不额外登记新工具或自己调一次模型(那会把原文又送出去)。
要处理哪些敏感内容
.env、config.yaml等文件里的赋值行,例如API_KEY=、DATABASE_URL=,保留键名,替换值。- 常见固定格式的凭证:AWS Access Key(
AKIA...)、GitHub Token(ghp_.../github_pat_...)、OpenAI key(sk-...)、Slack Token(xoxb-...)等,整段替换并保留类别。 - 私钥块:从
-----BEGIN ... PRIVATE KEY-----到-----END ...-----整段替换。 - URL 里的连接串,例如
postgres://user:pass@host里的user:pass@。
占位符格式
«REDACTED:aws_ak:abcd»
«REDACTED:github:abcd»
«REDACTED:assignment:abcd»
abcd 是原值短哈希,不同地方出现的同一个密钥会得到同一个占位符。
参与的三个插件入口
插件订阅这三个口,每个口只做一件事:拿到数据,扫描字符串,把敏感值换成占位符,然后交回去。
-
用户输入后(
agent/input):func OnAgentInput(in) { in.Content = maskSecrets(in.Content) // 用户正文 return in.Reply() }
-
工具回包后(
tools/post-execute):func OnToolPostExecute(in) { in.Result.Output = maskJSON(in.Result.Output) // 工具回包 in.Result.Error = maskSecrets(in.Result.Error) // 失败信息 delete(in.Result.Details.FullOutputPath) // 不让模型绕过脱敏读原文 return in.Reply() }
-
发给大模型前(
agent/request):func OnAgentRequest(in) { in.SystemPrompt = maskSecrets(in.SystemPrompt) for _, msg := range in.Messages { msg.Content = maskJSON(msg.Content) } for _, call := range in.ToolCalls { call.Arguments = maskJSON(call.Arguments) } return in.Reply() }
替换规则(maskSecrets)
按三条规则从左到右扫描文本,命中就换成占位符:
- 赋值行:
API_KEY=sk-1234→API_KEY=«REDACTED:assignment:abcd»,触发键名包括API_KEY、SECRET、TOKEN、PASSWORD、PRIVATE_KEY、AWS_SECRET、DATABASE_URL。 - 固定形状:
AKIAIOSFODNN7EXAMPLE→«REDACTED:aws_ak:abcd»;GitHub、OpenAI、Slack 等同理。 - 私钥块:整段 →
«REDACTED:pem:abcd»。
maskJSON 在 maskSecrets 基础上遍历 JSON:对象是 {...},数组是 [...],type=="image" 的 base64 跳过,其余字符串都扫。
实现位置
以 example/redact 的形式落地,作为插件系统的一个使用示例;不改主循环和 pkg/plugin。
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request
Activity
feat: 落地插件宿主、示例模板与脱敏插件 (#30)
[-]脱敏插件[/-][+][Plugin] 敏感凭据自动脱敏插件 (plugin/redact)[/+]