wyckit/PassGen

GitHub: wyckit/PassGen

PassGen 是一个以密码生成为演示领域的「符号意图架构」参考实现,展示了如何将自然语言转化为经校验的结构化意图后再执行,从而避免不可靠的语言直接触发工具操作。

Stars: 0 | Forks: 0

# PassGen [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/826802e953062648.svg)](https://github.com/wyckit/PassGen/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![.NET 10](https://img.shields.io/badge/.NET-10.0-512BD4.svg)](https://dotnet.microsoft.com/) **PassGen 看起来像是一个密码生成器。它实际上是一个小型的架构演示。** 现代 AI agent 可以调用工具、编写代码、查询数据库、发送消息并触发 工作流。这种能力引发了一个安全问题:**原始的自然语言并不是一个可靠的授权 层。** 一句具有说服力的话——无论是来自用户、网页、检索到的文档,还是另一个 工具的输出——都不应该能够*直接*引发一个操作。 PassGen 演示了一种不同的模式,即**符号意图架构 (Symbolic Intent Architecture, SIA)**: 该演示的领域之所以选择密码生成,是因为它规模小、对安全敏感,且易于 理解。项目中没有 LLM、没有 API 调用、没有云服务——这种“理解”存在于一个编译好的 知识图谱中,生成过程是一个确定性引擎,并且**每个结果都会根据 请求进行验证。** ## 核心转变 ![符号意图架构:语言提出,验证器把关,工具执行,审计器验证](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/0780617248062654.svg) ``` Common agent pattern ─ language has too much authority user / web / tool text ──► LLM ──► tool call ──► action ("hope the guardrails hold") Symbolic Intent Architecture ─ language becomes inspectable intent before action prompt ──► language resolver ──► symbolic graph ──► typed intent ──► validator ──► tool ──► verifier ──► audit (proposes) (constrains) (inspectable) (law) (machine) (inspector) (history) ``` 原始的自然语言永远不会直接接触工具。它必须首先转换为有类型、经过验证的结构——如果 这种结构是不可能存在或被禁止的,工具就永远不会被调用。请在 **[docs/SYMBOLIC-INTENT-ARCHITECTURE.md](docs/SYMBOLIC-INTENT-ARCHITECTURE.md)** 中阅读完整的模式。 ## 看见它:可见的流水线 `passgen --trace` 展示了全部五个阶段——语言转化为已验证意图的过程,以及 在工具运行前拒绝不可能请求的故障关闭场景: ![PassGen --trace:语言被解析为类型化意图,经过验证,由 CSPRNG 执行并检验——而不可能的请求会在工具运行前被拒绝](https://raw.githubusercontent.com/wyckit/PassGen/main/docs/demo.gif)
更喜欢看文本?以下是同样两次运行的面板逐项展示。 ``` $ passgen --trace "give me a 20-character password with 3 numbers, 2 symbols, no confusing characters" +-- [1] PROMPT (what the human said) | "give me a 20-character password with 3 numbers, 2 symbols, no confusing characters" v +-- [2] RESOLVED INTENT (language -> inspectable symbolic constraints) | length = 20 | numeric = min 3 | symbol = min 2 | exclude = ambiguous look-alikes (0 O o 1 l I) v +-- [3] VALIDATION (is the intent satisfiable?) | satisfiable = YES v +-- [4] EXECUTION (deterministic tool runs on validated intent) | rng = CSPRNG (cryptographically secure) | output = ^&Z!5n76^2^^E_RS3qn4 v +-- [5] VERIFICATION (post-conditions checked after execution) length: pass numeric: pass (>=3) symbol: pass (>=2) verdict: MATCHES REQUEST ``` 最能说明问题的是那个**不可能**的情况——即故障关闭: ``` $ passgen --trace "make me a 4-character password with 10 uppercase letters" +-- [3] VALIDATION satisfiable = NO status = REJECTED +-- [4] EXECUTION [ HALTED ] the generator is never invoked +-- [5] VERIFICATION [ BYPASSED ] nothing was produced to verify ```
语言提出了一些不可能的请求。符号层在任何工具运行**之前**就拒绝了它。 系统的目标不是试图迎合,而是力求准确无误。 ## 快速开始 ``` .\passgen.ps1 # interactive assistant .\passgen.ps1 give me a 16 char password, 2 uppercase, no ambiguous # one-shot .\passgen.ps1 --trace 20 chars, 3 digits, 2 symbols, no ambiguous # show the SIA pipeline .\passgen.ps1 what reduces password entropy # knowledge Q&A ``` ``` password: ktQ_+EVq8?Zy7GbK spec: len=16, allow: uppercase(min2)+lowercase+numeric+symbol, no-ambiguous entropy: 97.7 bits (very strong), charset 69, avg crack ~4.0e9 years check: OK -- satisfies the spec ``` ## 符号层:“TLM 即模型” PassGen 的符号层是一个 **TLM**(一个编译好的概念/关系知识图谱)。 词汇和语法并不是硬编码的——它们存在于 TLM 数据中: - **`rs-char-classes`** 包含类名别名(`digits`/`numbers`/`numeric` → numeric 等)。 - **`rs-nl-vocabulary`** 包含自然语言 (NL) *线索*——每个线索由一个 `Trigger` 短语和一个 `Signal` 组成(例如 `q.min`、 `target.length`、`only.`、`unsupported:`)。 - **`TlmNlu`** 在启动时加载这些线索和别名,并*根据*它们构建匹配器。 **覆盖率通过编辑 TLM 数据来提升,而不是修改代码**(参见 SIA 文档中的学习循环)。 生成过程是确定性且可审计的:默认使用 CSPRNG(无偏拒绝采样),仅在传入显式种子时使用 种子生成器(标记为 INSECURE),采用平坦均匀填充, 优先满足最小数量要求,重新检查每个结果,并将熵报告为精确的 `log2(valid count)`。 ## 文档 | 文档 | 内容 | |-----|------| | [docs/SYMBOLIC-INTENT-ARCHITECTURE.md](docs/SYMBOLIC-INTENT-ARCHITECTURE.md) | 范式、类比、如何推广(SQL/工作流/DevOps)、LLM 的适用位置 | | [THREAT_MODEL.md](THREAT_MODEL.md) | STRIDE + SIA 如何中和提示词注入 / MCP 工具风险 | | [SECURITY.md](SECURITY.md) | 安全策略 + 设计立场 | | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | PassGen 实现内部原理 | | [docs/NLU-MATRIX.md](docs/NLU-MATRIX.md) | 50 多种可归一化为相同符号形状的表述方式 | | [docs/GOAL-symbolic-intent-architecture.md](docs/GOAL-symbolic-intent-architecture.md) | 指导性目标提示词 | ## 布局 | 路径 | 用途 | |------|---------| | `PassGen.App/` | 助手程序:REPL + 一次性执行 + `--trace`,英语 → 密码 + 知识问答(无 LLM) | | `PassGen.Engine/` | 确定性引擎——规格、生成器、验证器、熵、`RandomStringTool` 以及 `TlmNlu`(TLM 驱动的解析器) | | `PassGen.Tlm/` | 独立的 TLM 格式库——编译器/反编译器、SHA-256 哈希器、`.tlmz` 封装(**与实时 RSRM 字节兼容**) | | `PassGen.Tlm.Cli/` | `tlm` CLI:`author` / `compile` / `decompile` / `validate` / `verify` | | `PassGen.Engine.Tests/` | xUnit 测试套件——针对性用例 + 从 TLM 词汇生成的覆盖矩阵 | | `dataset/` | 独立的 RSRM TLM 数据集(7 个关联的 TLM);参见 [dataset/README.md](dataset/README.md) | ## 构建 / 测试 / 运行 ``` dotnet test PassGen.Engine.Tests # full suite, net10.0 dotnet run --project PassGen.Engine.Demo # demo output + the tool schema .\build-dataset.ps1 # author -> compile -> decompile -> verify the TLMs .\make-publish.ps1 # assemble a self-contained publish/ bundle ``` ## 规范 net10.0 · 可空类型 + 隐式 using · 文件范围命名空间 · 用于契约的 `sealed record` + 主构造函数 · xUnit。`.ps1` 脚本保持仅包含 ASCII 字符。 ## 许可证 [MIT](LICENSE)。
标签:AI合规, AI智能体, 密码生成, 软件架构