clay-good/encryptalotta
GitHub: clay-good/encryptalotta
一款零服务器上传、完全离线可用的浏览器端 42 合 1 加密与开发者工具箱,涵盖 PGP 加密签名、密钥管理、编码转换、数据格式化等常用安全与开发功能。
Stars: 4 | Forks: 0
# encryptalotta
**免费、客户端隐私和开发者工具箱 —— 42 款工具,零服务器上传。**
一个综合性的单页 Web 应用,包含完全在您的浏览器中运行的 **42 款加密、编码、解析和开发者实用工具**。支持 PGP 密钥生成、密钥检查、吊销证书、QR 公钥共享、TLS / X.509 证书解析、OpenSSH 公钥解析、PEM ↔ DER 转换、BIP39 助记词生成和验证、文件和文本加密/解密、仅密码(对称)文件加密、图像隐写术、数字签名和验证、HMAC、JWT 检查和验证、PBKDF2 密钥派生、TOTP / 2FA、密码生成、ASCII 装甲转换、Shamir 秘密共享、EXIF 元数据剥离、哈希和校验和 (SHA-1 / 256 / 384 / 512)、Base64 / Base32 / Base58 / 十六进制编码、数字进制转换 (二进制 / 八进制 / 十进制 / 十六进制 / 任意 2-36 进制)、UUID v4 / v7 和 ULID 生成、Unix 时间戳转换、URL 解析、行级差异比较、CSV ↔ JSON ↔ TSV 转换、正则表达式测试、Cron 解码、带 WCAG 对比度检查的颜色转换、JSON / YAML / XML 格式化以及 CIDR / IPv4 子网计算。提供可搜索的命令面板 (`⌘K` / `Ctrl+K`),完整的键盘导航,五种 UI 语言。无服务器上传,无分析,无 CDN,无跟踪。
**灵感来自 [Kevin Qiu](https://www.linkedin.com/in/kevinmqiu)**
## 功能(42 款工具)
### 密钥(8 款工具)
- **生成 PGP 密钥** —— 创建 ECC (Curve25519) 或 RSA 3072 / 4096 密钥对,可自定义有效期。可选**监管机构预设** (BSI TR-02102-1、ANSSI RGS B1、NIST SP 800-57、CNSA 2.0、Privacy Guides) 自动从各监管机构发布的建议中填充算法 + 密钥大小,并链接到源文档。
- **密钥信息** —— 检查任何 PGP 公钥:指纹、用户 ID、算法、密钥大小、创建和过期日期。
- **吊销证书** —— 生成预签名证书以停用受损密钥。
- **QR 分享** —— 将 PGP 公钥或加密消息编码为一个或多个可扫描的 QR 码(长输入采用 multi-QR `EAL-QR/v1/{n}/{total}/`)。
- **TLS 证书解析器** —— 手写的 ASN.1 / DER 解码器,用于 X.509 证书:主题、颁发者、SAN、有效期、公钥算法、SHA-1 + SHA-256 指纹。
- **SSH 密钥解析器** —— OpenSSH RFC 4253 线路格式解析器:密钥类型 (rsa / ed25519 / ecdsa-sha2-nistp{256,384,521})、比特大小、`SHA256:` 指纹、注释。
- **PEM ↔ DER** —— 在 PEM(带页眉/页脚的 Base64)和 DER(原始二进制表示为十六进制)之间往返转换。
- **BIP39 助记词** —— 生成加密随机的 12 / 15 / 18 / 21 / 24 个单词的种子短语 (BIP-0039) 或验证任何现有助记词的校验和。使用可选密码在本地计算 BIP39 PBKDF2-HMAC-SHA512 种子。
### 加密 / 解密(5 款工具)
- **加密文件** —— 使用一个或多个 PGP 公钥加密文件。
- **解密文件** —— 使用您的私钥和密码解密 PGP 加密的文件。
- **文本消息** —— 为电子邮件、聊天或笔记加密或解密 PGP 文本块。
- **密码加密** —— 仅使用密码加密文件(对称,无需 PGP 密钥)。
- **隐写术** —— 使用 LSB 编码在 PNG 中隐藏加密的有效载荷。可选密码对有效载荷进行 XOR 运算(密码错误会使得魔术字节验证失败,不会输出乱码)。
### 签名 / 验证(4 款工具)
- **签名** —— 使用您的私钥为文件或文本生成 detached、attached 或 cleartext 的 PGP 签名。
- **验证** —— 根据公钥验证任何 PGP 签名。
- **HMAC** —— 使用 HMAC-SHA-1 / 256 / 384 / 512 进行签名和验证。验证时采用恒定时间比较;密钥缓冲区在使用后清零。
- **JWT 检查器** —— 解码三个 Base64-URL 部分;验证 HS256/384/512(共享密钥)、RS256/384/512(PEM SPKI 公钥)或 ES256/384/512(PEM SPKI ECDSA 密钥)。基于 `exp` 声明的过期指示器。
### 实用工具(25 款工具)
- **强密码生成器** —— 具有可自定义字符集和长度的加密随机密码。
- **ASCII Armor 转换器** —— 在 PGP 二进制和 ASCII-armored 编码之间进行往返转换。
- **Shamir 秘密共享** —— 将秘密分成 N 份,其中任意 K 份即可重构;份额格式为 `EAL-SSS/v1/{K}-of-{N}/{rawShare}`。
- **EXIF 擦除器** —— 通过 canvas 重新编码从 JPEG / PNG / WebP 中剥离 GPS、相机序列号、时间戳。
- **哈希与校验和** —— 对文本或文件计算 SHA-1 / 256 / 384 / 512 (Web Crypto) 和 BLAKE2b-512 (RFC 7693,手写),并采用恒定时间哈希比较。
- **Base64 / 32 / 58 / Hex 编码器** —— 交叉转换文本 ↔ 十六进制 ↔ Base64(标准 + URL 安全)↔ Base32 ↔ Base58(Bitcoin 字母表)。
- **UUID / ULID 生成器** —— UUID v4(随机)、UUID v7(RFC 9562 时间排序)、ULID。每次点击可批量生成多达 1000 个。
- **Unix 时间戳转换器** —— 自动检测 epoch 秒 / 毫秒 / ISO 8601;以 UTC、本地时间和相对时间("5 minutes ago")呈现。
- **URL 解析器** —— 通过内置 `URL` API 进行解析;展示 protocol/host/port/path/search/hash/origin 以及查询参数表。百分比编码和解码实用工具。
- **TOTP / 2FA** —— RFC 6238 生成器;接受 `otpauth://totp/...` URI 或裸 Base32 密钥。SHA-1/256/512,可配置数字位数(6–10)和周期(15–120)。停止时密钥清零。
- **Diff** —— 行级 LCS 比较,带有可选的忽略空白和忽略大小写切换。
- **CSV ↔ JSON ↔ TSV** —— RFC 4180 风格的解析器(带引号的字段、转义的 `""`、CRLF/LF)。自动检测分隔符,“第一行是表头”切换。
- **正则表达式测试器** —— 实时匹配高亮、编号 + 命名捕获组、替换预览。使用 `createElement` / `textContent` 构建(无 `innerHTML`)。
- **Cron 解码器** —— 解析 5 字段 cron(`*`、`*/n`、范围、列表、命名月份/星期);显示描述及本地时区接下来的 5 个触发时间。
- **颜色转换器** —— HEX ↔ RGB ↔ HSL ↔ OKLCH(手写 Oklab 矩阵)。WCAG AA / AAA 对比度检查器,带实时预览色板。
- **JSON / YAML / XML 格式化器** —— 漂亮打印、压缩和交叉转换 JSON ↔ YAML;单独漂亮打印或压缩 XML。自动检测输入格式。(省略了 TOML —— 在没有构建步骤的情况下,不存在小型的浏览器端解析器。)
- **CIDR / 子网计算器** —— 仅限 IPv4;纯 32 位无符号算术。网络地址、广播地址、网络掩码(带二进制视图)、通配符、第一个/最后一个可用主机、总数 + 可用计数、地址类别、RFC 1918 / loopback / link-local 标签。正确处理 `/0`、`/31` (RFC 3021) 和 `/32`。
- **PBKDF2 密钥派生** —— 通过 Web Crypto 实现 RFC 8018 基于密码的密钥派生。可配置迭代次数(1–10,000,000)、salt(文本或十六进制)、密钥长度(1–512 字节)和 PRF (SHA-1 / 256 / 384 / 512)。报告实际运行的派生时间,以便您可以将迭代次数调整至目标成本。
- **数字进制转换器** —— 同时在二进制、八进制、十进制、十六进制以及任意 2-36 进制之间转换整数。自动检测 `0x` / `0b` / `0o` 前缀;内部使用 BigInt,因此值不受限于 53 位 JS Number 精度;保留负数的原码表示 (sign-and-magnitude)。
- **IBAN 验证器 / 生成器** —— ISO 13616 MOD-97 校验和以及约 80 个 IBAN 司法管辖区的按国家/地区结构。在注册表定义了银行/分行/账户的地方将其拆分。生成器端为 fixtures 和集成测试生成语法有效的测试 IBAN(通过 `crypto.getRandomValues` 获取 BBAN,计算校验位)—— 明确标记为“仅供测试数据”。
- **BIC / SWIFT 代码检查器** —— 8 位和 11 位 BIC 的 ISO 9362 格式检查。解码银行/国家/地区/位置/分行,根据 IBAN 国家表交叉检查国家段,标记测试 BIC(末尾为 `0`)、被动参与者(末尾为 `1`)和主要分行(`XXX`)。
- **GS1 / EAN / GTIN 条形码** —— EAN-8、UPC-A、EAN-13 / GTIN-13、ITF-14 / GTIN-14 和 SSCC 的 Mod-10 加权校验和。从内联的 GS1 前缀注册表(约 130 个范围,涵盖所有已分配的前缀)中查找发行地区。
- **欧盟增值税号验证器** —— 对所有 27 个欧盟成员国 + GB、NO、CH、XI(北爱尔兰)进行格式检查。在存在已发布校验和的地方进行计算(DE/HR 使用 ISO 7064 MOD 11,10;IT/SE 使用 Luhn;BE 使用 mod-97;LU 使用 mod-89;许多其他国家使用 mod-11 加权)。ES 支持根据设计仅限于 CIF(企业)子集;明确拒绝个人的 NIF/NIE 输入并指向规范。无 VIES 往返 —— 完全离线。
- **Ed25519 签名 / 验证** —— 通过原生 Web Crypto (RFC 8032) 生成 Ed25519 密钥对并产生或验证签名。密钥以 32 字节种子形式往返;签名以 64 字节十六进制形式存在。与 SSH ed25519 密钥、age、Signal、Noise 和 sigstore 使用相同的原语。检测浏览器是否缺乏支持(需要 Safari 17 / Chrome 113 / Firefox 130)并显示显式提示条,而不是静默失败。
- **X25519 密钥协商** —— 通过原生 Web Crypto 生成 X25519 密钥对并派生共享密钥 (ECDH,RFC 7748),带有可选的 HKDF-SHA-256 / HKDF-SHA-512 后处理和用户提供的“info”上下文。它是 WireGuard、age、Signal、Noise、X3DH、TLS 1.3 的底层基础。
### 语言
界面已完全翻译为:
| 语言 | 代码 | 状态 |
|---|---|---|
| 英语 | `en` | 事实来源 |
| 法语 | `fr` | 仔细起草(建议由母语人士审查) |
| 简体中文 | `zh-CN` | 机器翻译质量(需要母语审查) |
| 德语 | `de` | 机器翻译质量(需要母语审查) |
| 印地语 | `hi` | 机器翻译质量(需要母语审查) |
语言在首次访问时从 `navigator.language` 自动检测,持久化在 `localStorage` 中,并可从顶部栏的选择器中进行切换。所有翻译均为静态内联 —— 没有 fetch,CSP不变。
**预渲染的 SEO 变体。** `/fr/`、`/zh/`、`/de/`、`/hi/` 由 `scripts/build-i18n-variants.js` 作为静态 HTML 生成。每个变体都具有本地化的 ``、``、OpenGraph 标签和 ``。源 `index.html` 为所有五个区域设置加上 `x-default` 声明了 ``。
**母语审查工具。** `scripts/export-strings-csv.js` 生成 `i18n/strings.csv`(键、en、fr、zh-CN、de、hi,加上每个区域设置的状态列)供母语审查员使用。`scripts/import-strings-csv.js` 将编辑内容往返传回到 `index.html` 中的内联 `STRINGS` 字面量。`en` 列被视为事实来源,不会被覆盖。
### 安全与隐私
- **100% 客户端** - 所有操作都在您的浏览器中进行
- **无服务器上传** - 您的文件和密钥永远不会离开您的设备
- **开源** - 您可以自己审计代码
- **离线可用** - 下载后无需互联网连接即可使用。一个最小化的 service worker (`sw.js`) 会在首次访问时预缓存外壳,以便后续加载直接从缓存中离线工作。
## 安全架构
Encryptalotta 从一开始就将安全性作为首要考虑进行设计。此应用程序实施了具有多层保护的深度防御。
### 零网络通信
**您的数据永远不会离开您的设备。** 这不仅是一个承诺 —— 它在密码学层面得到了强制执行:
- **内容安全策略 (CSP)** 带有 `connect-src 'none'` - 浏览器在物理上无法发出出站网络请求
- **无外部 API 调用** - 所有加密操作均在本地进行
- **无分析或跟踪** - 零遥测数据
- **完全离线工作** - 下载并在没有任何互联网连接的情况下使用
### 现代密码学
基于 [OpenPGP.js](https://openpgpjs.org/) v6.3.0 构建,这是一个经过充分审计的加密库:
| 算法 | 类型 | 安全级别 |
|-----------|------|----------------|
| **ECC Curve25519**(默认) | 椭圆曲线 | 高 - 现代标准 |
| RSA 3072 位 | 传统 | 高 |
| RSA 4096 位 | 传统 | 非常高 |
**为什么 ECC Curve25519 是默认选项:**
- 由著名密码学家 Daniel J. Bernstein 设计
- 在设计上能够抵御计时攻击
- 更小的密钥,但安全性等同于 RSA 3072
- 更快的密钥生成和加密/解密操作
### 供应链保护
**无 CDN 依赖。无 npm 包。无构建过程。**
所有第三方 JavaScript 都直接在存储库中进行内联供应,并在每个 `
```
#### 其他供应链保护
- **单文件应用程序** - 没有可能被破坏的复杂依赖链
- **无构建工具** - 您在存储库中看到的内容正是在浏览器中运行的内容
- **静态内联的翻译** - 内联 `STRINGS` 对象,没有 JSON fetch,CSP `connect-src 'none'` 保持不变
这消除了影响其他安全工具的整类供应链攻击。
### 内存安全
敏感数据在使用后会被从内存中清除:
- **自动密码清除** —— 密码字段在解密操作后被擦除。
- **页面卸载保护** —— 在 `beforeunload` 时,`clearSensitiveFields()` 会擦除所有 42 个工具中的每个密码、私钥、共享密钥、BIP39 助记词和 PBKDF2 密码输入,以及呈现解密明文、派生密钥、BIP39 种子、Shamir 秘密和隐写有效载荷的只读输出面板。公钥、签名消息和签名验证状态会被保留(它们不是秘密,清除它们会抹除审计上下文)。
- **JavaScript 变量清除** —— 敏感的 `Uint8Array` 缓冲区(PBKDF2 密码字节、生成的 PGP 私钥)在使用后通过 `.fill(0)` / `secureWipe()` 清零。(注意:这是尽力而为的 —— JS 引擎可能已经为 GC 保留了内部副本,并且 `String` 值是不可变的,因此我们无法原地覆盖它们。)
### 严格的内容安全策略
应用程序强制执行严格的 CSP,以防止常见的 Web 攻击:
```
default-src 'self';
script-src 'self' 'unsafe-inline';
style-src 'self' 'unsafe-inline';
img-src 'self' data: blob:;
connect-src 'none';
form-action 'self';
base-uri 'self';
frame-ancestors 'none';
upgrade-insecure-requests;
```
**这意味着:**
- `connect-src 'none'` —— **不允许网络请求**(数据泄露不可能)。通过 `scripts/audit-release.js` 进行审计:代码库中有零个 `fetch`、`XMLHttpRequest`、`WebSocket`、`EventSource` 或 `sendBeacon` 调用点。
- `frame-ancestors 'none'` —— 无法被嵌入到 iframes 中(防止点击劫持)。
- `form-action 'self'` —— 表单无法提交到外部服务器。
- `base-uri 'self'` —— 防止基础标签注入攻击。
- `img-src 'self' data: blob:` —— 需要 `blob:` 以便隐写术和 EXIF 擦除器工具可以通过 `URL.createObjectURL(file)` 渲染用户选择的图像。如果没有首先发出网络请求(这是 `connect-src 'none'` 所禁止的),则无法从网络响应创建 Blob URL;此应用程序中的每个 blob URL 均可明确追溯至本地文件或 canvas 的 `toBlob()` 调用,并在使用后撤销。
### HTTP 安全头
当部署到 Cloudflare Pages(或任何尊重 `_headers` 文件的服务器)时:
| Header | Value | Purpose |
|--------|-------|---------|
| `Strict-Transport-Security` | `max-age=31536000; includeSubDomains; preload` | 强制使用 HTTPS 1 年 |
| `X-Content-Type-Options` | `nosniff` | 防止 MIME 类型嗅探 |
| `X-Frame-Options` | `DENY` | 阻止 iframe 嵌入 |
| `X-XSS-Protection` | `1; mode=block` | 旧版 XSS 保护 |
| `Referrer-Policy` | `no-referrer` | 不泄露 URL |
| `Cross-Origin-Opener-Policy` | `same-origin` | 隔离浏览上下文 |
| `Cross-Origin-Embedder-Policy` | `require-corp` | 防止跨源泄露 |
| `Cross-Origin-Resource-Policy` | `same-origin` | 阻止跨源读取 |
| `Cache-Control` | `no-store, no-cache, must-revalidate` | 防止缓存敏感页面 |
### 权限策略
可能被滥用的浏览器功能被明确禁用。当前策略拒绝了除 `clipboard-write=(self)` 之外的所有功能(以便每个工具的**复制**按钮能正常工作) —— `clipboard-read` 被拒绝,因此没有脚本可以静默窃取您剪贴板上的内容。
已拒绝:accelerometer、autoplay、camera、clipboard-read、cross-origin-isolated、display-capture、encrypted-media、fullscreen、geolocation、gyroscope、keyboard-map、magnetometer、microphone、midi、payment、picture-in-picture、publickey-credentials-get、screen-wake-lock、sync-xhr、usb、web-share、xr-spatial-tracking。
允许:仅 `clipboard-write=(self)`。
### 强密码要求
私钥受强制密码要求的保护:
- 最少 12 个字符
- 必须包含大写字母
- 必须包含小写字母
- 必须包含数字
- 必须包含特殊字符
- 需要确认密码
- 弱密码警告系统(如果需要可以覆盖)
### 输入安全
- 密码字段使用 `type="password"` 隐藏输入
- `autocomplete="off"` 防止浏览器保存敏感字段的密码
- 没有敏感数据存储在 localStorage、sessionStorage 或 cookies 中
### 本项目不作声明的部分
对于静态 Web 页面所能承诺的局限性,我们是坦诚的。**我们不声称“100% 安全”或“零攻击面”。** 那是营销,而不是工程。处理加密秘密的静态页面具有真实的攻击面,在信任它处理任何重要内容之前,您应该了解这一点。
- **您的浏览器和操作系统是信任边界的一部分。** 恶意浏览器扩展注入的同源 JavaScript 可以从 DOM 和内存中读取秘密。Web Crypto 无法保护您免受受破坏的浏览器环境的影响。对于高价值操作,请使用干净的浏览器配置文件,或者完全不使用扩展。
- **TLS 路径是信任边界的一部分。** 当您从 `encryptalotta.com` 加载此页面时,您信任的是 Cloudflare 的 TLS 和我们的 DNS。如果您想消除这种信任假设,请克隆存储库,根据 [清单](#manifest) 验证 SHA-384 哈希值,然后从磁盘打开 `index.html` —— 它完全可以离线工作。
- **CSS 注入的样式技巧是真实存在的。** 受损的样式表(我们仅使用内联样式,但在代理/扩展层仍然可能进行样式表注入)原则上可以通过计时或 `:has()` 选择器揭示用户输入。严格的 CSP 使这变得困难,但并非不可能。
- **OpenPGP.js 过去曾有过 CVE。** 将库固定到特定版本意味着我们不会自动拉取上游修复。我们承诺进行手动更新频率(见下文);请检查您是否正在运行最新的标记版本。
- **密码学的正确性依赖于其他人编写的库。** OpenPGP.js、qrcode-generator 和 secrets.js-grempe 都是第三方依赖。我们基于它们的审计历史、代码可审查性和积极维护来信任它们 —— 但这是一个信任边界,而不是不存在信任边界。
- **隐写术隐藏的是存在性,内容。** 不要将其推销(或依赖其)作为抵御国家级对手的保护。复杂的隐写分析(卡方 LSB 测试、RS-analysis)能以高置信度检测 LSB 修改。请先加密有效载荷;隐写层仅用于日常隐蔽。
如果您的威胁模型包括以下任何一种:坚定的民族国家、控制您的网络或端点的针对性攻击者、浏览器扩展级别的对手,或“在任何情况下都绝不能泄露”——请使用在物理隔离机器上的桌面工具。本项目用于日常客户端密码学,不用于保护国家机密。
### 依赖更新频率
内联库由 SHA-384 哈希固定,因此我们不会自动拉取上游修复。为了弥补:
- **季度审查** —— 每季度至少检查一次 OpenPGP.js、qrcode-generator、secrets.js-grempe 和 js-yaml 的新版本。比较差异与固定版本,内联新的压缩文件,更新两处的 SHA-384 哈希值(`