用本机 TPM 或 DPAPI 封存密钥,杜绝明文落盘
28/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add rickwindman/dsh-destinywind-tpm该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(dependency_conflict · 2026/10/16) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 24 处,展示前 24 条)
- 读取本地文件index.js:116
text = await readFile(this.path, 'utf8') - 写入本地文件index.js:176
await mkdir(dirname(this.path), { recursive: true }) - 写入本地文件index.js:178
await writeFile(staging, text, { mode: 0o600 }) - 写入本地文件index.js:179
await rename(staging, this.path) - 读取本地文件index.js:352
const parsed = JSON.parse(await readFile(this.path, 'utf8')) - 执行外部命令来自配置/变量dpapi.js:63
const child = spawn(shell, ['-NoProfile', '-NonInteractive', '-EncodedCommand', encodeCommand(script)], { - 执行外部命令来自配置/变量linux.js:37
const child = spawn(command, args, { stdio: ['pipe', 'pipe', 'pipe'] }) - 写入本地文件linux.js:91
await mkdir(dir, { recursive: true, mode: 0o700 }) - 读取本地文件linux.js:97
await readFile(primary) - 读取本地文件linux.js:102
await readFile(pub) - 读取本地文件linux.js:103
await readFile(priv) - 写入本地文件linux.js:128
await writeFile(input, Buffer.from(probe, 'utf8')) - 读取本地文件linux.js:131
const back = await readFile(input, 'utf8') - 删除本地文件linux.js:132
await rm(input, { force: true }) - 删除本地文件linux.js:133
await rm(output, { force: true }) - 写入本地文件linux.js:143
await writeFile(input, bytes) - 读取本地文件linux.js:146
return await readFile(output) - 删除本地文件linux.js:148
await rm(input, { force: true }) - 删除本地文件linux.js:149
await rm(output, { force: true }) - 写入本地文件linux.js:156
await writeFile(input, blob) - 读取本地文件linux.js:159
return await readFile(output) - 删除本地文件linux.js:161
await rm(input, { force: true }) - 删除本地文件linux.js:162
await rm(output, { force: true }) - 执行外部命令来自配置/变量tpm.js:94
const child = spawn(shell, ['-NoProfile', '-NonInteractive', '-EncodedCommand', encodeCommand(script)], {
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-credentials@deepseek-ai/dsh-credentials-local@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-launch-environment@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 插件:TPM/DPAPI 封存的凭据服务商,取代明文凭据文件 · 为 DeepSeek Harness 提供 TPM/DPAPI 封存凭据的插件
README
由 DeepSeek 最新模型翻译生成dsh-destinywind-tpm
跨平台硬件级凭据存储插件(DSH bundle)。引用值与记录在落盘前用本机最强的密钥保护者封存(AES-256-GCM 信封加密),只在 resolve 时解封:
- Windows:TPM(CNG Microsoft Platform Crypto Provider)优先,回退 DPAPI
- Linux:TPM 2.0(tpm2-tools)优先,回退会话密钥环(libsecret)
- 两者皆不可用则拒绝挂载,绝不落明文
安装
声明了 dsh.bundle.patch,装完即生效,无需手工编辑任何配置文件:
plugin_manager { action: "install_bundle", target: "<本仓库绝对路径>" }
命令行等价形式:
dsh plugin --profile web add link:<本仓库绝对路径>
安装后重启 dsh web 生效。本补丁会按 id 覆盖默认的 credentials 行(置 disabled: true)——一个上下文只能提供一个 credentials 服务。
展开完整文档(README 剩余 1 节)
dsh-destinywind-tpm
跨平台硬件级凭据存储插件(DSH bundle)。引用值与记录在落盘前用本机最强的密钥保护者封存(AES-256-GCM 信封加密),只在 resolve 时解封:
- Windows:TPM(CNG Microsoft Platform Crypto Provider)优先,回退 DPAPI
- Linux:TPM 2.0(tpm2-tools)优先,回退会话密钥环(libsecret)
- 两者皆不可用则拒绝挂载,绝不落明文
安装
声明了 dsh.bundle.patch,装完即生效,无需手工编辑任何配置文件:
plugin_manager { action: "install_bundle", target: "<本仓库绝对路径>" }
命令行等价形式:
dsh plugin --profile web add link:<本仓库绝对路径>
安装后重启 dsh web 生效。本补丁会按 id 覆盖默认的 credentials 行(置 disabled: true)——一个上下文只能提供一个 credentials 服务。
行为要点
- 密库文件:$DSH_HOME/.credentials.dpapi.json(权限 0600,staging + 原子 rename 落盘)
- 没有明文回退层:全新安装在新值保存之前解析不到任何凭据,这是刻意设计
- 密钥绑定本机本用户:密库文件复制到其他机器/账户无法解密,备份即失效
- 禁用本 bundle 恢复默认提供方;已封存的值保持封存,需为默认提供方重新录入
- 启动时校验:重新解封全部密文,任何解封失败都会报错而非静默降级
换装影响:已输入的密钥会怎样
凭据服务在本机只有一个实现槽位:本插件与官方 @deepseek-ai/dsh-credentials-local(明文 .credentials.yaml)互斥占位,消费方(设置页、各插件)只认标准接口,不关心背后是谁。因此换引擎只影响存在凭据服务里的值。
完全不受影响:
- 模型连接器的账号登录态(workbuddy / trae 等走各自的登录流程,不经过凭据服务)
- 进程环境变量与 .env 文件里的值(见下方解析顺序,这两层在密库之外)
受影响、需重录一次:凭据服务里的引用值——包括在设置页输入的模型 API Key(如 DeepSeek 提供器把 Key 存为凭据引用 DEEPSEEK_API_KEY,插件配置里只留引用名,真值在凭据服务)。
解析顺序(与官方提供方一致,process → 密库 → .env):
1. 进程环境变量(启动 dsh 的 shell 或系统用户变量)
2. 本插件密库(官方提供方则为 .credentials.yaml)
3. 项目 .env(启动目录)→ 用户 .env($DSH_HOME/.env)
两个方向都无迁移,刻意设计:
- 从官方明文提供方换到本插件:.credentials.yaml 里的旧值不会被读取;设置页这些 Key 显示未配置,重新录入一遍即入封存库。旧文件原样保留,确认无用后可自行删除。
- 禁用/卸载本插件回到官方:封存值保持封存,官方提供方读不到,同样需重录(密库文件留在原地,装回即恢复)。
优先级陷阱:进程环境变量压过密库——同名变量存在时解析直接用它,密库值被遮蔽;此时 set/unset 也会拒绝写入该引用(防误改)。症状「在设置里改了 Key 但不生效」先查启动环境里有没有旧变量,而不是反复重录。
测试
tests/ 是本机集成测试(离线端到端 + 模块解析钩子),依赖本机 D:\dsh 安装环境(路径硬编码),不能直接在 CI 运行:
node --import ./tests/resolve-hook.mjs tests/offline.mjs
许可
MIT,见 LICENSE。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
rickwindman/dsh-destinywind-tpm
用本机 TPM 或 DPAPI 封存密钥,杜绝明文落盘
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1