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 生成。每个变体都具有本地化的 ``、`<meta name="description">`、OpenGraph 标签和 `<link rel="canonical">`。源 `index.html` 为所有五个区域设置加上 `x-default` 声明了 `<link rel="alternate" hreflang>`。 **母语审查工具。** `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 都直接在存储库中进行内联供应,并在每个 `<script>` 标签旁边的 HTML 注释中记录了 SHA-384 完整性哈希值。下面的清单让您验证从本存储库下载的内容是否与维护者发布的内容相匹配,以及在浏览器中运行的内容是否与官方上游库版本相匹配。 #### 清单 | 文件 | 库 | 版本 | 许可证 | 源码 | SHA-384 (base64) | |---|---|---|---|---|---| | `openpgp.min.js` | OpenPGP.js | 6.3.0 | LGPL-3.0 | <https://github.com/openpgpjs/openpgpjs> | `Z5tStPoeClmuLPd1gAwdTCU53WcAkUjBNw7mEEvrQumVuNqEl52A9Nx5IhFdKE/c` | | `qrcode.js` | qrcode-generator | 2.0.4 | MIT | <https://github.com/kazuhikoarase/qrcode-generator> | `e9EFD6BGC90bkW9aDV5xbbBfzwN7G8YImHao2lfLVKV/hPB0E0go+H3I64h7oHtA` | | `secrets.min.js` | secrets.js-grempe | 2.0.0 | MIT | <https://github.com/grempe/secrets.js> | `xfBMbh8fdSIrQ9XbZARwZ5z/Eh9zC7gsgG5vSE331lZSjgXQob1KxM4m7vEdH0e0` | | `js-yaml.min.js` | js-yaml | 4.1.1 | MIT | <https://github.com/nodeca/js-yaml> | `ZeqCzuWczURac3RacSufGD7oSbzeaX7xxnnOr3PTcYTLx4Av0qBj0kBq7AeCtHLA` | 每个哈希值也作为 HTML 注释内联记录在 [index.html](index.html) 中相应的 `<script>` 标签旁边,因此审查页面源代码的读者可以看到相同的完整性声明。 #### 针对上游进行验证 从上表中列出的上游源下载已发布的发行版,以相同的方式对其进行哈希处理(参见下面的 [验证完整性](#verifying-integrity)),并进行比较。哈希值匹配 → 与官方版本逐字节一致。 不匹配意味着: 1. 您下载了不同的版本(检查版本号)。 2. 存储库的内联副本被修改了(审查差异)。 3. 上游发行版被修改了(罕见,但有可能 —— 与另一个镜像交叉核对)。 #### 为什么使用 SHA-384 而不是 SRI? W3C Subresource Integrity (SRI) 属性要求脚本以跨源方式提供或具有特定的 CORS 设置。由于这些文件是从静态站点同源提供的,SRI 没有提供额外的好处。此处的 SHA-384 哈希值用于相同的审计目的 —— 它们让任何读者都能确认字节没有被更改。 如果您将此存储库 fork 到不同的域并想要添加 SRI,请将每个 `<script src="...">` 替换为固定完整性的形式: ``` <script src="./openpgp.min.js" integrity="sha384-Z5tStPoeClmuLPd1gAwdTCU53WcAkUjBNw7mEEvrQumVuNqEl52A9Nx5IhFdKE/c" crossorigin="anonymous"></script> ``` #### 其他供应链保护 - **单文件应用程序** - 没有可能被破坏的复杂依赖链 - **无构建工具** - 您在存储库中看到的内容正是在浏览器中运行的内容 - **静态内联的翻译** - 内联 `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 哈希值(`<script>` 标签旁的 HTML 注释,以及上面的 [清单](#manifest) 表格),然后重新运行 `node scripts/audit-release.js`。 - **对建议的即时响应** —— 如果任何内联库发布了 CVE 或安全建议,将此升级视为 P0:在 48 小时内内联补丁,推送版本,并在提交消息中注明 CVE。 - **预提交哈希检查** —— `scripts/git-hooks/pre-commit`(此存储库中版本化的钩子)在每次提交时重新对每个内联库进行哈希处理,如果磁盘上的字节与记录的哈希值不匹配,则拒绝落地更改。在全新的克隆上安装使用:`ln -sf ../../scripts/git-hooks/pre-commit .git/hooks/pre-commit`。该钩子仅运行 `scripts/audit-release.js`,它把关所有 14 项可机械检查的约束条件(innerHTML 卫生、STRINGS 对等性、i18n 键解析、内联 SHA-384 交叉检查、CSP 完整性、无出站向量、页面权重、区域设置变体同步、robots.txt + sitemap.xml + JSON-LD 存在,以及 Phase-7 SEO 散文关键词覆盖范围)。 - **自动季度提醒** —— `.github/workflows/dep-check.yml` 在每个季度的第一天(1 月 / 4 月 / 7 月 / 10 月)运行 `scripts/check-dependency-updates.js`。该脚本读取 [清单](#manifest),查询每个上游的 GitHub Releases API,如果任何固定版本落后于上游,则以非零状态退出。然后工作流会打开一个跟踪 issue。已发布的站点绝不进行网络调用 —— 这仅在 GitHub Actions 中运行。提醒仅供参考;实际的内联 + 重新哈希操作仍需手动进行(步骤如下)。 ## 导航与用户体验 界面采用**主页网格 + 命令面板**设计,旨在桌面和移动端保持简约: - **主页 (`#/`)** —— 单个屏幕,按类别分组卡片展示每个工具。完整的工具列表在首次绘制时即渲染在 DOM 中,因此搜索引擎能看到所有工具。 - **命令面板 (`⌘K` / `Ctrl+K` 或 `/`)** —— 打开带模糊搜索输入的居中模态框。输入几个字母,使用 ↑/↓ 移动,Enter 打开,Esc 关闭。移动端:点击顶部栏的搜索框。 - **顶部栏** —— logo(返回主页)、搜索框、语言选择器。仅此而已。没有嵌套标签页,没有汉堡菜单。 - **面包屑导航** —— 在工具内部时,页面顶部有一个细长的“← 所有工具”按钮 + “组 / 当前工具”的路径。一键返回主页。 - **深层链接** —— 每个工具都有自己的 URL(例如 `#/keys/qr`,`#/utilities/exif`),因此您可以为特定工具添加书签或分享。 - **键盘优先** —— `⌘K`/`Ctrl+K` 搜索,方向键导航,Enter 打开,Esc 关闭。无需鼠标。 - **上次使用持久化** —— `localStorage.lastTool` 记住了您最后使用的工具,因此重新打开页面会返回到那里(首次访问时返回主页)。 ## 触手可及的所有功能 所有 42 款工具分为四组。每款工具都有一个深层链接路由。 ### 密钥(8) | 工具 | Route | 功能 | |---|---|---| | **生成密钥** | `#/keys/generate` | 创建新的 PGP 密钥对 (ECC Curve25519 或 RSA 3072 / 4096) | | **密钥信息** | `#/keys/key-info` | 检查任何 PGP 密钥的指纹、用户 ID、算法、过期时间 | | **吊销密钥** | `#/keys/revoke` | 为受损的密钥创建吊销证书 | | **QR 分享** | `#/keys/qr` | 将公钥或消息编码为 QR(长输入采用 multi-QR) | | **TLS 证书解析器** | `#/keys/tls-cert` | 解码 X.509 证书:subject、SAN、有效期、指纹 | | **SSH 密钥解析器** | `#/keys/ssh-key` | 检查 OpenSSH 公钥:类型、位数、SHA-256 指纹 | | **PEM ↔ DER** | `#/keys/pem-der` | 在 PEM (Base64) 和 DER (二进制) 编码之间转换 | | **BIP39 助记词** | `#/keys/bip39` | 生成或验证 BIP-0039 助记词种子短语 (12 / 15 / 18 / 21 / 24 个单词) | ### 加密 / 解密(5) | 工具 | Route | 功能 | |---|---|---| | **加密文件** | `#/crypt/encrypt` | 使用一个或多个 PGP 公钥加密文件 | | **解密文件** | `#/crypt/decrypt` | 使用您的私钥 + 密码解密文件 | | **文本消息** | `#/crypt/text-crypto` | 为电子邮件、聊天或笔记加密/解密 PGP 文本 | | **密码加密** | `#/crypt/password-encrypt` | 仅使用密码加密文件(无需 PGP 密钥) | | **隐写术** | `#/crypt/stego` | 使用 LSB 编码在 PNG 中隐藏有效载荷 | ### 签名 / 验证(4) | 工具 | Route | 功能 | |---|---|---| | **签名** | `#/signing/sign` | 数字签名消息或文件(detached、attached、cleartext) | | **验证** | `#/signing/verify` | 根据公钥验证 PGP 签名 | | **HMAC** | `#/signing/hmac` | HMAC-SHA-1/256/384/512 签名和验证(恒定时间比较) | | **JWT 检查器** | `#/signing/jwt` | 解码 + 验证 HS / RS / ES JWT;显示 `exp` 声明 | ### 实用工具(25) | 工具 | Route | 功能 | |---|---|---| | **密码** | `#/utilities/passwords` | 生成加密的强随机密码 | | **Armor** | `#/utilities/armor` | 在 PGP 二进制和 ASCII-armored 编码之间转换 | | **Shamir 拆分** | `#/utilities/shamir` | 将秘密分成 N 份;任意 K 份即可重构 | | **EXIF 擦除器** | `#/utilities/exif` | 从 JPEG、PNG、WebP 图像中剥离 GPS / 元数据 | | **哈希与校验和** | `#/utilities/hash` | SHA-1/256/384/512 带恒定时间比较 | | **编码** | `#/utilities/encode` | 交叉转换 Base64 / Base32 / Base58 / Hex / 文本 | | **UUID / ULID** | `#/utilities/uuid` | 批量生成 UUID v4、UUID v7 或 ULID | | **Unix 时间戳** | `#/utilities/timestamp` | 转换 epoch ↔ ISO 8601 ↔ UTC ↔ 本地 ↔ 相对时间 | | **URL 解析器** | `#/utilities/url` | 解析 + 百分比编码 / 解码 URL 和查询 | | **TOTP / 2FA** | `#/utilities/totp` | RFC 6238 代码生成器 (otpauth:// URI 或裸 secret) | | **Diff** | `#/utilities/diff` | 行级 LCS 差异比较,带有空格/大小写切换 | | **CSV / JSON / TSV** | `#/utilities/csv` | 使用 RFC 4180 引号转换表格数据 | | **正则表达式测试器** | `#/utilities/regex` | 实时匹配高亮 + 捕获组 + 替换 | | **Cron 解码器** | `#/utilities/cron` | 解码 cron 表达式 + 显示接下来的 5 次运行时间 | | **颜色转换器** | `#/utilities/color` | HEX / RGB / HSL / OKLCH + WCAG 对比度检查器 | | **格式化 / 转换** | `#/utilities/format` | 漂亮打印 / 压缩 / 转换 JSON、YAML 和 XML | | **CIDR / 子网** | `#/utilities/cidr` | 解码 IPv4 CIDR:网络地址、广播地址、主机范围、标签 | | **PBKDF2** | `#/utilities/pbkdf2` | 从密码派生密钥(可配置迭代次数、salt、PRF) | | **数字进制** | `#/utilities/base` | 在二进制、八进制、十进制、十六进制、任意 2-36 进制之间转换整数 | | **IBAN** | `#/utilities/iban` | ISO 13616 MOD-97 验证器 + 测试数据生成器(按国家/地区结构) | | **BIC / SWIFT** | `#/utilities/bic` | ISO 9362 格式检查 + 银行/国家/地区/位置/分行解码器 | | **GS1 条形码** | `#/utilities/gs1` | EAN-8/-13、UPC-A、GTIN-14、SSCC 的 Mod-10 校验和 + GS1 前缀查找 | | **EU VAT** | `#/utilities/vat` | 对 EU / GB / NO / CH / XI 增值税号的格式 + 校验和检查(离线) | | **Ed25519** | `#/utilities/ed25519` | 通过 Web Crypto 使用原生 Ed25519 (RFC 8032) 进行生成/签名/验证 | | **X25519** | `#/utilities/x25519` | 带有可选 HKDF-SHA-256 / SHA-512 的 ECDH 密钥协商 (RFC 7748) | ## 各工具安全说明 ### QR 分享 - 纯客户端 QR 渲染,通过内联的 [qrcode-generator](https://github.com/kazuhikoarase/qrcode-generator) 实现。canvas 在本地绘制;生成的唯一 blob URL 用于下载锚点(对 `img-src` 不可见),因此 CSP 不变。 - 对于超过 1,200 字节的输入,输入会被分块为带有前缀 `EAL-QR/v1/{n}/{total}/` 的多 QR 序列。容量强制为 1,200 字节 × 16 块 = 最大 19,200 字节。 - 分块使用 UTF-8 字节长度 (`TextEncoder`) 和对代理对安全的分割解码 (`TextDecoder({stream: true})`)。 ### 隐写术 - **威胁模型:日常隐蔽,而非国家级对手。** 复杂的隐写分析(卡方 LSB 测试、RS-analysis)能以高置信度检测 LSB 修改。此工具适用于数据的*存在性*不应被普通观察者察觉的情况。 - **务必先加密有效载荷。** 使用“文本消息”选项卡生成 PGP 块,然后在此处隐藏该块。隐写术隐藏存在性,而不是内容。 - 格式:4 字节魔术字符 `EAL1` + 4 字节大端长度 + 有效载荷字节编码到 R/G/B 通道的 LSB 中(alpha 通道未触及,透明度得以保留)。 - 可选密码使用 `SHA-256(password || counter_be32)` 密钥流对有效载荷进行 XOR 运算。错误的密码在 99.9%+ 的情况下会导致魔术字节不匹配,从而显示“未找到有效载荷”错误,而不是输出乱码。 - **仅支持 PNG。** 不可能输出 JPEG —— 重新编码会破坏 LSB 数据。输入格式通过 `accept="image/png"` 强制执行。 ### Shamir 秘密共享 - 基于经过充分审计的 [secrets.js-grempe](https://github.com/grempe/secrets.js) 库构建,使用 256 位安全参数初始化。 - 份额格式:`EAL-SSS/v/{K}-of-{N}/{rawShare}`,因此阈值元数据一目了然。合并处理器接受带或不带此前缀的份额。 - **每个份额都会泄露秘密的长度。** 如果长度敏感,请在拆分前将秘密填充到固定大小。 - 份额彼此独立 —— 没有任何单一份额(或任何 K−1 个份额)会透露有关秘密的任何信息。请通过单独的渠道分发它们。 ### EXIF 擦除器 - 纯 canvas 重新编码,无外部库。剥离是通过将图像绘制到 `<canvas>` 并调用 `toBlob()` 实现的 —— 浏览器的图像编码器会生成无元数据的输出。 - 剥离前的检测(仅供参考)解析 JPEG APP1 段以获取 IFD0 + GPS-IFD 标签计数,以及 PNG `tEXt`/`iTXt`/`zTXt`/`eXIf` 块。无论检测结果如何,剥离操作都会执行。 - **重新编码会对图像进行重新压缩。** 对于包含敏感元数据且您希望在不重新压缩的情况下去除的 JPEG,请使用桌面工具。默认质量为 92,可在 50-100 之间调节。 ### BIP39 助记词 - **BIP39 助记词是钱包主密钥。** 持有这些单词的任何人都可以派生出从中派生的每个账户中的每个私钥,跨越每条链。把这些单词当作现金对待,而不是电子邮件密码。 - 熵通过 `crypto.getRandomValues`(浏览器的 Web Crypto CSPRNG)在本地生成。官方 BIP-0039 英文单词表(2048 个单词)内联供应;没有网络 fetch。 - 种子根据 BIP39 规范通过 `PBKDF2-HMAC-SHA512(mnemonic, "mnemonic" + passphrase, 2048 iterations, 64 bytes)` 计算,使用 Web Crypto。 - 助记词文本区域和密码字段均包含在 `clearSensitiveFields()` 中,并在页面卸载时擦除 —— 但标签页快照、浏览器扩展或屏幕录制可能同时捕获它们。**对于高价值钱包,请在物理隔离的机器上生成助记词。** - 验证仅限离线(校验和 + 种子派生)。它不检查助记词是否控制任何链上的资金。 ### PBKDF2 密钥派生 - Web Crypto 的 `SubtleCrypto.deriveBits` 在本地运行 PBKDF2 循环;密码缓冲区在派生调用后被清零。 - 迭代计数和 PRF 选择直接决定了暴力破解成本。**OWASP 2023 指南**:PBKDF2-HMAC-SHA-256 至少需要 600,000 次迭代,SHA-1 至少需要 1,300,000 次。默认的 100,000 次对于*测试向量*来说是保守的,不适用于保护真实密码 —— 在将派生密钥发布到生产存储之前,请增加该值。 - 可选的**监管机构预设** (BSI TR-02102-1、ANSSI RGS B1、NIST SP 800-132 / OWASP 最低要求、Privacy Guides) 自动从各权威机构发布的建议中填充 `iterations` + PRF 并链接到源文档。手动编辑 iterations 或 PRF 会将下拉菜单重置为“自定义”,以便当用户偏离建议时,UI 绝不会声称是监管机构的建议。 - 输出长度上限为 512 字节,以避免病态输入;这远高于任何标准对称密钥的大小。 - **PBKDF2 不是最强的基于密码的 KDF。** 对于新设计,如果运行时间允许,请首选 Argon2id(内存困难)。此处包含 PBKDF2 是因为它是 Web Crypto 附带的最低共同标准,并且符合 RFC 8018、JWE/PKCS#5 生态系统以及大多数现有测试向量。 ### 数字进制转换器 - 纯 JavaScript BigInt —— 没有库 —— 因此值不受限于 53 位 JS Number 精度,没有 `Number.MAX_SAFE_INTEGER` 边缘情况。 - 负数以原码形式存储:`-0xff` → 十进制 `-255` → 二进制 `-11111111`。不产生二进制补码视图;如果您在固定宽度寄存器中需要它们,请使用适当的 `2^n - 1` 进行显式掩码处理。 - 输入中的下划线作为数字分组分隔符被去除(匹配 Python / Rust 字面量)。当选择“自动”时,会识别前导的 `0x` / `0b` / `0o`。 ## 技术 - 纯 HTML、CSS 和 JavaScript —— 无框架,部署时无构建步骤。 - [OpenPGP.js](https://openpgpjs.org/) v6.3.0 —— PGP 密钥生成、加密、解密、签名(本地内联供应)。 - [qrcode-generator](https://github.com/kazuhikoarase/qrcode-generator) v2.0.4 —— 用于 QR 分享工具的 QR 渲染(本地内联供应)。 - [secrets.js-grempe](https://github.com/grempe/secrets.js) v2.0.0 —— Shamir 秘密共享数学运算(本地内联供应)。 - [js-yaml](https://github.com/nodeca/js-yaml) v4.1.1 —— 用于格式化/转换工具的 YAML 解析和生成(本地内联供应)。 - **Web Crypto API** (`SubtleCrypto.digest` / `sign` / `verify` / `importKey`) —— 哈希、HMAC、JWT 验证、TOTP、隐写术密钥流、证书指纹。 - **手写,无库**:ASN.1 / DER 解码(TLS 证书解析器)、OpenSSH 线路格式(SSH 密钥解析器)、Base32 / Base58 编解码器、OKLCH 色彩矩阵、Cron 解析器、CIDR 算术、行级 LCS 差异比较、RFC 4180 CSV 解析器、正则表达式高亮、百分比编码辅助工具 —— 保持手写而不是内联供应,以使总页面重量保持在 gzip 压缩后 0.32 MB 以下。 - **单文件部署** (`index.html`) 加上四个内联库 —— 每个脚本都通过 SHA-384 哈希固定,并在每次提交时由 `scripts/audit-release.js` 与 README 清单以及磁盘上的字节进行交叉检查。 ## 密钥生成选项 | 选项 | 值 | 备注 | |--------|--------|-------| | **算法** | ECC (Curve25519)、RSA 3072、RSA 4096 | 推荐 ECC | | **过期时间** | 永不、1、2 或 5 年 | 根据用例选择 | | **密码** | 用户定义 | 强制执行强密码要求 | ## 文件大小建议 | 大小 | 性能 | 建议 | |------|-------------|----------------| | 100MB 以下 | 最佳 | 推荐 | | 100MB - 500MB | 可能较慢 | 请耐心使用 | | 超过 500MB | 有浏览器崩溃风险 | 请先拆分文件 | | 超过 1GB | 不推荐 | 请使用桌面 PGP 工具 | ## 与其他工具的比较 | 功能 | Encryptalotta | 基于 Web 的 PGP 工具 | 桌面 PGP | |---------|---------------|---------------------|-------------| | 无服务器上传 | 是 | 经常否 | 是 | | 无 CDN 依赖 | 是 | 通常否 | 是 | | 离线可用 | 是 | 通常否 | 是 | | 无需安装 | 是 | 是 | 否 | | 开源 | 是 | 不定 | 通常 是 | | 现代化 ECC 默认 | 是 | 不定 | 不定 | | 强制执行 CSP | 是 | 很少 | 不适用 | | 数字签名 | 是 | 有时 | 是 | | 密码加密 | 是 | 很少 | 是 | | 密钥信息查看器 | 是 | 很少 | 是 | | 密码生成器 | 是 | 很少 | 有时 | ## 开发 这是一个单文件应用程序。只需在 Web 浏览器中打开 `index.html` 或部署到任何静态托管服务即可。 ### 本地开发 ``` git clone https://github.com/clay-good/encryptalotta.git cd encryptalotta # 在浏览器中打开 index.html - 大功告成! ``` ### 预发布流程(合并到 main 之前) ``` # 从源 STRINGS table 重新生成 /fr/, /zh/, /de/, /hi/。 node scripts/build-i18n-variants.js # 运行所有自动化 security/quality gates。遇到首次失败时以非零状态退出。 node scripts/audit-release.js ``` 审计检查:零个 `innerHTML =` 赋值,所有 5 个区域设置的 STRINGS 对等性,每个 `data-i18n` 键均已解析,内联的 SHA-384 哈希值与 HTML 注释 + README 清单 + 磁盘上的字节相匹配,meta 和 `_headers` 上的 CSP `connect-src 'none'`,无出站网络调用点,页面重量在 2 MB gzip 压缩以下,区域设置变体(`/fr/`、`/zh/`、`/de/`、`/hi/`)与源同步,`robots.txt` + `sitemap.xml` + JSON-LD 存在,所有 42 个工具的 Phase-7 SEO 散文关键词覆盖范围,以及(如果存在)`sbom.json` 哈希一致性和 `encryptalotta-portable.html` 没有 `<script src=>` 引用。 ### 构建产物(用于分发 / 审计,可选) ``` # 生成用于 USB / file:// / 便携使用的独立单文件 build。 node scripts/build-portable.js # → encryptalotta-portable.html (~1.3 MB) # 生成 CycloneDX 1.5 SBOM,列出所有 vendored deps 及其 SHA-256/384/512 hashes。 node scripts/build-sbom.js # → sbom.json # 为当前 working tree 追加 SHA-256 manifest 部分(在 tagged releases 时使用)。 node scripts/build-release-manifest.js # → RELEASES.md (append-only) ``` 所有三个脚本都是确定性的:在输入不变的情况下重新运行会产生逐字节相同的输出,因此将它们连接到发布流水线是安全的。审计会将 `sbom.json` 哈希与磁盘上的内联字节进行交叉检查 —— 如果您更新了内联库而忘记重新生成 SBOM,则下次提交的审计将会失败。 ### 预提交钩子(推荐) 在全新的克隆上安装版本化钩子,以便在每次提交时运行 `audit-release.js`: ``` ln -sf ../../scripts/git-hooks/pre-commit .git/hooks/pre-commit ``` ### 验证完整性 要验证内联库是否未被篡改,请运行: ``` openssl dgst -sha384 -binary openpgp.min.js | openssl base64 -A # Z5tStPoeClmuLPd1gAwdTCU53WcAkUjBNw7mEEvrQumVuNqEl52A9Nx5IhFdKE/c openssl dgst -sha384 -binary qrcode.js | openssl base64 -A # e9EFD6BGC90bkW9aDV5xbbBfzwN7G8YImHao2lfLVKV/hPB0E0go+H3I64h7oHtA openssl dgst -sha384 -binary secrets.min.js | openssl base64 -A # xfBMbh8fdSIrQ9XbZARwZ5z/Eh9zC7gsgG5vSE331lZSjgXQob1KxM4m7vEdH0e0 openssl dgst -sha384 -binary js-yaml.min.js | openssl base64 -A # ZeqCzuWczURac3RacSufGD7oSbzeaX7xxnnOr3PTcYTLx4Av0qBj0kBq7AeCtHLA ``` 或者一次性运行: ``` for f in openpgp.min.js qrcode.js secrets.min.js js-yaml.min.js; do printf '%-22s %s\n' "$f" "$(openssl dgst -sha384 -binary "$f" | openssl base64 -A)" done ``` 将每个输出与上面的 [清单](#manifest) 进行比较。 ## 部署 ### 任何静态主机 1. 克隆存储库 2. 将整个目录部署到您的静态托管提供商 3. 确保所有文件都使用正确的 MIME 类型提供 ### Cloudflare Pages(推荐) 本站点针对 Cloudflare Pages 部署进行了优化,带有自动安全头: 1. Fork 或克隆此存储库 2. 连接到 Cloudflare Pages 3. 部署 - 无需构建命令(静态 HTML) 4. `_headers` 文件中的安全头会自动应用 ## 文件 | 文件 / 目录 | 用途 | |------|---------| | `index.html` | 主应用程序(单文件、自包含,包括所有 UI + i18n 字符串 + 工具逻辑) | | `openpgp.min.js` | 内联供应的 OpenPGP.js(密钥生成、加密、解密、签名) | | `qrcode.js` | 内联供应的 qrcode-generator(QR 分享工具) | | `secrets.min.js` | 内联供应的 secrets.js-grempe(Shamir 秘密共享工具) | | `js-yaml.min.js` | 内联供应的 js-yaml(格式化 / 转换工具 —— YAML 解析 / 生成) | | `_headers` | Cloudflare Pages 的 HTTP 安全头 | | `favicon.ico`、`favicon-*.png` | 浏览器标签页图标 | | `apple-touch-icon.png` | iOS 主屏幕图标 | | `encryptalotta.png` | Logo / OpenGraph 图像 | | `site.webmanifest` | Web 应用清单 | | `robots.txt`、`sitemap.xml` | 搜索引擎指令 | | `fr/`、`zh/`、`de/`、`hi/` | 预渲染的 SEO 变体(由 `scripts/build-i18n-variants.js` 构建) | | `i18n/strings.csv` | 从 `STRINGS` 导出的供审查员使用的 CSV(由 `scripts/export-strings-csv.js` 构建) | | `scripts/build-i18n-variants.js` | 为每个非英语区域设置生成本地化的静态 HTML | | `scripts/export-strings-csv.js` / `import-strings-csv.js` | 用于母语人士审查的 CSV 往返工具 | | `scripts/audit-release.js` | 发布把关审计:14 项机械安全和质量检查 | | `scripts/build-sitemap.js` | 使用今天的 `<lastmod>` 和 5 个区域设置根目录重新生成 `sitemap.xml` | | `scripts/check-dependency-updates.js` | 季度上游版本检查器(仅供 GitHub Actions 使用 —— 从未在实时站点上运行) | | `scripts/git-hooks/pre-commit` | 运行 `audit-release.js` 的版本化预提交钩子 | | `.github/workflows/dep-check.yml` | 运行 `check-dependency-updates.js` 的季度 GitHub Actions 工作流 | ## 重要安全说明 **密钥备份:** 如果您丢失了私钥,您将无法解密您的文件。永远不能。没有恢复。 **密钥安全:** 切勿与任何人分享您的私钥。您的公钥可以安全分享。 **浏览器安全:** 此工具的安全性仅与您的浏览器环境相当。请在受信任的设备上使用已更新的浏览器。 **密码强度:** 使用强大且唯一的密码。内置的密码生成器可以帮助创建安全的密码。 **吊销证书:** 在创建新密钥对后,请立即生成并安全存储吊销证书。这允许您在密钥受损时使其失效。 **密码加密:** 使用仅密码加密时,请选择一个强密码。如果您忘记了密码,将没有恢复机制。 **签名验证:** 在信任来自该密钥的签名之前,请务必通过受信任的渠道验证公钥指纹。 **离线使用:** 为了获得最大安全性,请下载存储库并在物理隔离的机器上离线使用。 ## 安全审计 此应用程序是开源的,专门为了让安全研究人员能够对其进行审计。需要审查的关键领域: - `index.html` - 所有应用程序逻辑(CSP meta 标签、JavaScript 加密调用、内存清除、i18n、所有 42 个工具) - `_headers` - HTTP 安全头 - `openpgp.min.js` - 与官方 OpenPGP.js v6.3.0 发行版进行比较 - `qrcode.js` - 与官方 qrcode-generator v2.0.4 发行版进行比较 - `secrets.min.js` - 与官方 secrets.js-grempe v2.0.0 发行版进行比较 - `js-yaml.min.js` - 与官方 js-yaml v4.1.1 发行版进行比较 - 上面的 [清单](#manifest) 部分 —— 所有内联库的 SHA-384 清单 一个便于 grep 的审计约束条件:代码库中有**零个 `innerHTML =` 赋值**。所有 DOM 构建都通过 `createElement` / `textContent` / `setAttribute` 进行,消除了最常见的 XSS 攻击向量,即使内容完全由开发者控制也是如此。 发现漏洞?请通过 [GitHub Issues](https://github.com/clay-good/encryptalotta/issues) 报告,或直接联系维护者。</div><div><strong>标签:</strong>Base64编解码, BIP39, CVE, DNS 反向解析, ECC加密, EXIF数据移除, HMAC, JWT解析, OpenSSH, PEM转换, PGP加密, RSA加密, SamuraiWTF, SHA-256, Shamir秘密共享, TOTP, X.509证书解析, 双因素认证(2FA), 哈希校验, 多模态安全, 威胁情报, 客户端加密, 密码学, 密码生成器, 密钥生成, 开发者工具, 手动系统调用, 数字签名, 数据可视化, 数据解析, 文件加密, 文本加密, 无服务端, 浏览器工具箱, 离线应用, 网络安全, 网络安全, 网络安全合规, 网络隐私, 隐写术, 隐私保护, 隐私保护, 零知识架构</div></article></div> <!-- 人机验证 --> <script> (function () { var base = (document.querySelector('base') && document.querySelector('base').getAttribute('href')) || ''; var path = base.replace(/\/?$/, '') + '/cap-wasm/cap_wasm.min.js'; window.CAP_CUSTOM_WASM_URL = new URL(path, window.location.href).href; })(); </script> </body> </html>