cloakllm/CloakLLM-PY
GitHub: cloakllm/CloakLLM-PY
介于应用与 LLM 提供商之间的 Python PII 隐藏中间件,自动识别并替换敏感信息,保护数据不被发送到云端模型,同时提供符合 EU AI Act 要求的防篡改审计日志。
Stars: 0 | Forks: 0
# 🛡️ CloakLLM
**隐藏你的提示词。证明你的合规性。**
你发送给 LLM 提供商的每一个提示词都是以明文形式可见的 —— 姓名、电子邮件、SSN、API 密钥、医疗记录。CloakLLM 会拦截、隐藏(Cloak)并审计每一次调用。
```
┌──────────────┐ ┌─────────────────────┐ ┌──────────────┐
│ Your App │───▶│ CLOAKLLM │───▶│ Claude/GPT │
│ │ │ │ │ /Gemini │
│ "Email │ │ "Email [PERSON_0] │ │ │
│ john@..." │ │ [EMAIL_0]..." │ │ Never sees │
│ │◀───│ │◀───│ real data │
└──────────────┘ └─────────────────────┘ └──────────────┘
│
┌─────────────┐
│ Hash-Chain │
│ Audit Log │
│ (EU AI Act) │
└─────────────┘
> **Also available for JavaScript/TypeScript:** `npm install cloakllm` — zero dependencies, OpenAI SDK integration. See [CloakLLM JS](https://github.com/cloakllm/CloakLLM-JS). | [Project Hub](https://github.com/cloakllm/CloakLLM)
```
## ⏰ 为什么是现在?
**欧盟 AI 法案 (EU AI Act) 将于 2026 年 8 月 2 日开始执行。** 第 12 条要求具备监管机构可以数学验证的防篡改审计日志。违规后果:高达 **全球年收入的 7%**。
你当前的日志记录 (`logger.info()`) 无法通过审计。CloakLLM 提供:
- 🔒 **PII 检测** — 通过 NER + 正则表达式检测姓名、电子邮件、SSN、API 密钥、IP、信用卡、IBAN
- 🎭 **保留上下文的隐藏** — `John Smith` → `[PERSON_0]`(LLM 仍能理解该提示词)
- ⛓️ **防篡改审计链** — 每个事件都通过哈希链接。任何篡改都会破坏链条。
- ⚡ **一行中间件** — OpenAI SDK 和 LiteLLM(100+ 提供商)的即插即用保护
## 🚀 快速开始
### 安装
```
pip install cloakllm # standalone usage
pip install cloakllm[litellm] # with LiteLLM integration
python -m spacy download en_core_web_sm
```
### 选项 A:使用 OpenAI SDK(一行代码)
```
from cloakllm import enable_openai
from openai import OpenAI
client = OpenAI()
enable_openai(client) # Done. All calls are now cloaked.
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Email john@acme.com about Project X"}]
)
# Provider 从未看到 "john@acme.com" — 只有 "[EMAIL_0]"
# Response 在您看到之前自动解密
```
### 选项 B:使用 LiteLLM(一行代码)
```
import cloakllm
cloakllm.enable() # Done. All LiteLLM calls are now cloaked.
import litellm
response = litellm.completion(
model="anthropic/claude-sonnet-4-20250514",
messages=[{"role": "user", "content": "Email john@acme.com about Project X"}]
)
# Provider 从未看到 "john@acme.com" — 只有 "[EMAIL_0]"
# Response 在您看到之前自动解密
```
### 选项 C:独立使用
```
from cloakllm import Shield
shield = Shield()
# Cloak
cloaked, token_map = shield.sanitize(
"Send report to john@acme.com, SSN 123-45-6789"
)
# cloaked: "发送报告到 [EMAIL_0], SSN [SSN_0]"
# ... 向任意 LLM 发送 cloaked prompt ...
# Uncloak response
clean = shield.desanitize(llm_response, token_map)
```
### 脱敏模式(不可逆)
```
from cloakllm import Shield, ShieldConfig
shield = Shield(ShieldConfig(mode="redact"))
redacted, _ = shield.sanitize("Email john@acme.com about Sarah Johnson")
# redacted: "向 [PERSON_REDACTED] 发送关于 [EMAIL_REDACTED] 的邮件"
# 未存储 token map — 无法逆向
```
### 实体详情(合规元数据)
```
from cloakllm import Shield
shield = Shield()
sanitized, token_map = shield.sanitize("Email john@acme.com, SSN 123-45-6789")
# Per-entity metadata (无原始文本 — PII-safe)
token_map.entity_details
# [
# {"category": "EMAIL", "start": 6, "end": 19, "length": 13, "confidence": 0.95, "source": "regex", "token": "[EMAIL_0]"},
# {"category": "SSN", "start": 25, "end": 36, "length": 11, "confidence": 0.95, "source": "regex", "token": "[SSN_0]"}
# ]
# 用于仪表板的完整报告
token_map.to_report()
# {"entity_count": 2, "categories": {...}, "tokens": [...], "mode": "tokenize", "entity_details": [...]}
```
### 选项 D:CLI
```
# 扫描文本中的敏感数据
python -m cloakllm scan "Email john@acme.com, SSN 123-45-6789"
# 验证 audit chain 完整性
python -m cloakllm verify ./cloakllm_audit/
# 查看 audit 统计信息
python -m cloakllm stats ./cloakllm_audit/
```
## ⛓️ 防篡改审计链
每个隐藏事件都记录在哈希链式的仅追加日志中:
```
{
"seq": 42,
"event_id": "a1b2c3d4-...",
"timestamp": "2026-02-27T14:30:00+00:00",
"event_type": "sanitize",
"model": "claude-sonnet-4-20250514",
"entity_count": 3,
"categories": {"PERSON": 1, "EMAIL": 1, "SSN": 1},
"tokens_used": ["[PERSON_0]", "[EMAIL_0]", "[SSN_0]"],
"prompt_hash": "sha256:9f86d0...",
"sanitized_hash": "sha256:a3f2b1...",
"entity_details": [
{"category": "PERSON", "start": 0, "end": 10, "length": 10, "confidence": 0.85, "source": "spacy", "token": "[PERSON_0]"},
{"category": "EMAIL", "start": 12, "end": 25, "length": 13, "confidence": 0.95, "source": "regex", "token": "[EMAIL_0]"},
{"category": "SSN", "start": 27, "end": 38, "length": 11, "confidence": 0.95, "source": "regex", "token": "[SSN_0]"}
],
"latency_ms": 4.2,
"prev_hash": "sha256:7c4d2e...",
"entry_hash": "sha256:b5e8f3..."
}
```
**链条验证:**
```
python -m cloakllm verify ./cloakllm_audit/
# ✅ Audit chain 完整性已验证 — 未检测到篡改。
```
如果任何人修改了单个条目,后续的每个哈希都会失效:
```
Entry #40 ✅ → #41 ✅ → #42 ❌ TAMPERED → #43 ❌ BROKEN → ...
```
这正是欧盟 AI 法案第 12 条所要求的。
## ⚙️ 配置
```
from cloakllm import Shield, ShieldConfig
shield = Shield(config=ShieldConfig(
# Detection
spacy_model="en_core_web_lg", # Larger model = better accuracy
detect_emails=True,
detect_phones=True,
detect_api_keys=True,
custom_patterns=[ # Your own regex patterns
("PROJECT_CODE", r"PRJ-\d{4}-\w+"),
("INTERNAL_ID", r"EMP-\d{6}"),
],
# Audit
log_dir="./compliance_audit",
log_original_values=False, # Never log original PII
# Middleware
skip_models=["ollama/", "local/"], # Don't cloak local model calls
))
```
**LLM 检测(可选)** — 使用本地 Ollama 实例来捕获语义 PII(地址、医疗信息等):
```
shield = Shield(config=ShieldConfig(
llm_detection=True, # Enable LLM-based detection
llm_model="llama3.2", # Ollama model to use
llm_ollama_url="http://localhost:11434", # Ollama endpoint
llm_timeout=10.0, # Timeout in seconds
llm_confidence=0.85, # Confidence score for LLM detections
))
```
环境变量:
```
CLOAKLLM_LOG_DIR=./audit
CLOAKLLM_SPACY_MODEL=en_core_web_sm
CLOAKLLM_OTEL_ENABLED=true
CLOAKLLM_LLM_DETECTION=true
CLOAKLLM_LLM_MODEL=llama3.2
CLOAKLLM_OLLAMA_URL=http://localhost:11434
```
## 🔍 检测内容
| 类别 | 示例 | 方法 |
|----------|----------|--------|
| `PERSON` | John Smith, Sarah Johnson | spaCy NER |
| `ORG` | Acme Corp, Google | spaCy NER |
| `GPE` | New York, Israel | spaCy NER |
| `EMAIL` | john@acme.com | Regex |
| `PHONE` | +1-555-0142, 050-123-4567 | Regex |
| `SSN` | 123-45-6789 | Regex |
| `CREDIT_CARD` | 4111111111111111 | Regex |
| `IP_ADDRESS` | 192.168.1.100 | Regex |
| `API_KEY` | sk-abc123..., AKIA... | Regex |
| `IBAN` | DE89370400440532013000 | Regex |
| `JWT` | eyJhbGciOi... | Regex |
| Custom | 你的模式 | Regex |
| `ADDRESS` | 742 Evergreen Terrace | LLM (Local) |
| `DATE_OF_BIRTH` | 1990-01-15 | LLM (Local) |
| `MEDICAL` | diabetes mellitus | LLM (Local) |
| `FINANCIAL` | account 4521-XXX | LLM (Local) |
| `NATIONAL_ID` | TZ 12345678 | LLM (Local) |
| `BIOMETRIC` | fingerprint hash | LLM (Local) |
| `USERNAME` | @johndoe42 | LLM (Local) |
| `PASSWORD` | P@ssw0rd123 | LLM (Local) |
| `VEHICLE` | plate ABC-1234 | LLM (Local) |
## 🗺️ 路线图
- [x] PII 检测 (NER + regex)
- [x] 确定性分词
- [x] 哈希链审计日志
- [x] LiteLLM 中间件集成
- [x] OpenAI SDK 中间件集成
- [x] CLI 工具
- [x] 脱敏 / 清洗模式
- [x] 字段级 PII 元数据 (entity_details)
- [ ] OpenTelemetry span 发射(带自动脱敏)
- [ ] RFC 3161 可信时间戳
- [ ] 已签名的审计快照
- [ ] MCP 安全网关(工具验证,权限执行)
- [x] 本地 LLM 检测(可选,通过 Ollama)
- [ ] 基于敏感性的路由(PII → 本地模型,通用 → 云端)
- [ ] 管理仪表板
- [ ] 欧盟 AI 法案合规报告生成器
## 📜 许可证
MIT
## 🤝 贡献
欢迎提交 PR。最高影响力的领域:
1. **非英语 NER** — 希伯来语、阿拉伯语、中文 PII 检测
2. **去分词准确性** — 处理 LLM 的复述
3. **OpenTelemetry 集成** — GenAI 语义约定
4. **MCP 安全** — 工具验证中间件
**为欧盟 AI 法案截止日期而构建。在审计人员到来之前发布。**
标签:AI风险缓解, Claude, CVE检测, DLP, EU AI Act, GDPR, Gemini, GPT, JSONLines, LLM 安全, LLM评估, NER, Ollama, PII 脱敏, Python SDK, spaCy, 中间件, 哈希链, 审计日志, 对抗攻击, 提示词工程, 敏感信息检测, 数据掩码, 数据防泄露, 漏洞管理, 策略决策点, 网络安全, 身份信息保护, 逆向工具, 隐私保护, 零信任