# dsh-privacy-gateway [English](README.md) · 简体中文 DeepSeek Harness(DSH)的本地隐私网关。 > **我想让 AI 处理客户数据,但不想让真实的姓名、手机号、身份证号发给模型。** 它做两件事: - **对话脱敏**:每次请求模型前,把你消息里的个人信息替换成占位符。模型和会话日志只会看到占位符,你的屏幕上显示原文,并带 🔒 标记。 - **表格安全副本**:在本机按列扫描 CSV/XLSX 文件,生成一份脱敏副本,交给 AI 的是这份副本而不是原文件。 所有功能都在右侧边栏的 **🔒 Privacy Gateway** 标签页里,点会话顶部的 🔒 按钮可以打开。界面语言跟随 DSH 的语言设置(中文或英文)。 ## 安装 在 DSH Desktop 中打开 设置 → 插件 → 添加插件,填入: ```text https://github.com/ethanrise/dsh-privacy-gateway ``` 安装后重新加载 DSH。使用命令行:`dsh plugin --profile web add github:ethanrise/dsh-privacy-gateway`。 ## 对话脱敏 ```text 你输入: 给客户张三发邮件 zs@example.com,电话 13812345678 模型看到: 给客户[PERSON_7C1E0A93B2]发邮件 [EMAIL_41D0E6F8A5],电话 [PHONE_2B9F4C07D1] 你的屏幕: 给客户🔒张三发邮件 🔒zs@example.com,电话 🔒13812345678 ``` 规则能识别的类型: | 类型 | 识别方式 | |---|---| | 姓名 PERSON | 有上下文的中文姓名:前面有标签("客户张三"、"联系人:欧阳"),后面有称谓("王经理"、"李建国女士"),或后面是"的"加联系方式("王小二的邮箱") | | 手机号 PHONE | 中国大陆手机号,可带 +86、空格或横杠 | | 邮箱 EMAIL | 邮箱地址 | | 身份证 ID_CARD | 中国大陆居民身份证号,校验位验证 | | 银行卡 BANK_CARD | 16–19 位卡号,Luhn 校验 | | IP | IPv4 地址(默认关闭:技术类对话里太常见) | **脱敏词库**:规则识别不了的名称,比如公司名、没有上下文的人名、项目代号,可以填进侧边栏的词库,一行一个词,也可以从 CSV/XLSX 客户名单中导入某一列。每个词精确匹配,英文不区分大小写,存在包含关系时优先匹配更长的词。不会自动生成简称:填了 `字节跳动有限公司` 不会连带脱敏 `字节跳动`,如果对话里也会这样写,需要单独再加一行。 **占位符**由本机密钥通过 HMAC 生成:同一个值永远对应同一个占位符,所以模型仍能区分不同的人并正确引用,提示词缓存也保持稳定。占位符无需手动维护。 **屏幕显示**:占位符会被原地还原,前面加 🔒 并高亮显示,模型回复里的占位符也会还原,带不带方括号都可以。点击可以查看类型、模型看到的占位符和实际内容,并可复制。关闭"显示原文"可以看到模型实际收到的内容。**没有 🔒 的内容就是以明文发出去的。** ## 表格安全副本 1. 在侧边栏选择 CSV 或 XLSX 文件,文件只在本机内存中解析。 2. 根据表头和内容判断每列的类型(姓名、手机号、邮箱、身份证、IP、公司、地址),给出置信度和建议的处理方式。 3. 每列选择保留、打码(`138****5678`)、令牌化(稳定的 HMAC 令牌)或删除。 4. 下载 `<文件名>.safe.csv` / `<文件名>.safe.xlsx`,由你自己把这份副本发给 AI。 ## 数据存放位置 所有数据都留在本机的 `~/.dsh-privacy-gateway/` 目录下,文件权限 `0600`: | 文件 | 内容 | |---|---| | `token-secret` | 生成占位符和令牌用的 HMAC 密钥 | | `vault.json` | 占位符 → 原文的对应关系,重启后界面仍能还原历史消息 | | `dictionary.json` | 你的脱敏词库 | 浏览器只能通过插件自己的本地接口读取原文。安全边界详见 [SECURITY.md](SECURITY.md)。 ## 局限 - 姓名识别基于规则:没有标签、称谓或联系方式词的单独姓名识别不了,除非加进词库;姓名后面跟着不常见的字时,边界可能多一个字或少一个字。 - 规则不识别地址和公司名,请使用词库。 - DSH 不允许插件改写工具参数,所以模型写文件或执行命令时用的是占位符,不是原文。 - 工具结果(读取的文件内容、命令输出)只有在 `maskToolResults: true` 时才脱敏。默认关闭,因为开启后模型可能把占位符写进它编辑的文件。 - 消息上的复制按钮复制的是存储的文本,其中是占位符;手动选中还原后的文字复制时,🔒 会一起被复制。 - 开启脱敏或修改词库只对之后发送的消息生效,已经发出的消息不会补做。 - 表格安全副本需要你自己发给 AI,插件不会自动把它加入会话。 ## 配置 在插件的 `cordis.patch.yml` 条目中: | 配置项 | 默认值 | 含义 | |---|---|---| | `maskMessages` | `true` | 发给模型前对对话消息脱敏(也可在侧边栏切换) | | `maskToolResults` | `false` | 同时对工具结果脱敏 | | `entities` | `[PERSON, PHONE, EMAIL, ID_CARD, BANK_CARD]` | 规则识别的类型;加上 `IP` 即可开启 IP 识别 | | `persistVault` | `true` | 把 `vault.json` 保存到磁盘 | | `maxVaultEntries` | `20000` | 超过后丢弃最早的条目 | ## 开发 ```bash npm install npm run check # 类型检查、测试、构建 ``` `lib/` 目录会提交到仓库,因为 DSH 从仓库安装时不会执行构建:服务端入口由 esbuild 连同依赖打包成单个文件,浏览器端入口也是单个模块。修改源码后请运行 `npm run build` 并提交 `lib/`。在 `main` 分支上修改 `package.json` 的 `version` 会自动发布一个带预构建 `dsh-privacy-gateway.tgz` 的 Release。