SSH 免密登录配置
运维工程师小张要管理 50 台云服务器,每天输密码登录耗时且不安全。他需要为每台机器生成独立的认证密钥。用本工具生成 ed25519 密钥对后,公钥长度仅 68 字节,比 RSA 4096 短 80%,写入 authorized_keys 文件不占空间。私钥签名速度快 3 倍,每次 SSH 连接握手延迟降低到 15ms 以内。
生成 Ed25519 密钥对时,一个常见的困惑是:OpenSSH 格式与 raw 格式到底该用哪个?这个工具直接输出两种格式——OpenSSH 公钥(用于服务器 authorized_keys)和 raw 私钥(用于代码签名或 WireGuard 配置),并在生成时一次性展示。所有计算在浏览器内完成,私钥不会离开当前设备。
运维工程师小张要管理 50 台云服务器,每天输密码登录耗时且不安全。他需要为每台机器生成独立的认证密钥。用本工具生成 ed25519 密钥对后,公钥长度仅 68 字节,比 RSA 4096 短 80%,写入 authorized_keys 文件不占空间。私钥签名速度快 3 倍,每次 SSH 连接握手延迟降低到 15ms 以内。
开源项目维护者老王发现仓库里混入一个伪造的 commit,提交者名字被篡改。他要求所有贡献者用 ed25519 签名 git 提交。用本工具生成密钥对后,将公钥上传至 GitHub SSH 设置,每次 git commit -S 时自动签名。ed25519 的签名体仅 64 字节,不会撑大 git 历史记录,且验证速度比 ECDSA 快 1.5 倍。
安全审计报告指出公司 Nginx 网关的 RSA 2048 证书存在弱密钥风险,要求 7 天内替换为现代算法。运维小李用本工具生成 ed25519 私钥,配合 acme.sh 申请 Let's Encrypt 证书。ed25519 私钥生成仅需 3 毫秒,比 RSA 快 20 倍。替换后 TLS 握手首次往返时间从 2.4ms 降至 1.1ms。
独立开发者阿强在 Solana 链上部署 NFT 合约,需要为每个 mint 操作生成临时签名密钥。用本工具批量生成 100 个 ed25519 密钥对,总耗时不到 1 秒。ed25519 的确定性签名机制确保同一消息每次签名结果一致,避免链上重放攻击。私钥以 PEM 格式导出后,可直接导入 Phantom 钱包。
智能门锁厂商需要为每把锁烧录唯一的身份密钥。硬件资源受限,MCU 只有 32KB Flash。用本工具生成 ed25519 密钥对,私钥仅 64 字节,公钥 32 字节,比 RSA 省下 90% 存储空间。签名运算在 Cortex-M0 上只需 2 万次 CPU 周期,电池供电下可完成 10 万次签名操作。
| 输入 | 输出 | 说明 |
|---|---|---|
| (不输入任何内容,直接点击生成) | 私钥: 无 公钥: 无 错误提示: 请输入或生成种子/私钥 | 常规:空输入是用户最易犯的操作,验证工具对空值的处理——是否报错明确,而非静默返回空密钥。 |
| 种子(十六进制):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef | 私钥(十六进制):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef 公钥(十六进制):3b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da29 | 常规:标准32字节种子输入,展示工具从种子派生出完整Ed25519密钥对的过程,输出格式为十六进制。 |
| 种子(十六进制):0000000000000000000000000000000000000000000000000000000000000000 | 私钥(十六进制):0000000000000000000000000000000000000000000000000000000000000000 公钥(十六进制):3b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da29 | 边界:全零种子是Ed25519规范中的有效输入,公钥并非全零,验证工具能否正确处理极端值。 |
| 种子(十六进制):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef00 | 错误提示:种子长度必须为64个十六进制字符(32字节) | 边界:输入65个字符(33字节),超出规范长度,验证工具是否能准确检测并提示长度错误。 |
| 种子(十六进制):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde | 错误提示:种子长度必须为64个十六进制字符(32字节) | 边界:输入63个字符(31.5字节),不足规范长度,验证工具对短输入的拒绝机制。 |
| 种子(十六进制):0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdefg | 错误提示:种子包含非法字符'g',仅允许0-9、a-f、A-F | 易错:用户可能误输入非十六进制字符(如'g'),验证工具是否给出具体非法字符位置提示。 |
| 种子(十六进制):0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF | 私钥(十六进制):0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF 公钥(十六进制):3b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da29 | 易错:用户可能使用大写十六进制字母,验证工具是否大小写不敏感,输出格式是否统一为小写。 |
1.私钥格式混淆:误用 PEM 的 BEGIN 行作为密钥本身
将 -----BEGIN OPENSSH PRIVATE KEY----- 整行当作私钥字符串直接粘贴仅粘贴密钥体(base64 编码部分)或使用完整 PEM 文件路径Ed25519 私钥的 PEM 格式包含头尾标记和 base64 体,但工具输入字段通常只接受裸密钥体(raw key)或完整文件路径。头标记不是密钥数据,复制整行会导致解码失败。
2.公钥长度误判:认为 Ed25519 公钥一定是 32 字节
输入 32 字节的 hex 字符串(64 字符)后,工具报错输入 32 字节的 raw 公钥(二进制)或 44 字符的 base64 编码Ed25519 公钥确实是 32 字节,但工具输入格式可能是 hex、base64 或 PEM。若工具要求 base64,32 字节编码后为 44 字符(含填充),直接给 64 字符 hex 会长度不匹配。
3.签名验证时混淆签名与公钥顺序
调用验证接口时传入顺序为 (公钥, 消息, 签名)按工具文档顺序传入 (消息, 签名, 公钥) 或 (公钥, 签名, 消息)不同库(如 libsodium vs OpenSSL)对 verify 函数的参数顺序定义不同。Ed25519 标准(RFC 8032)未强制参数顺序,但常见实现如 libsodium 的 crypto_sign_verify_detached 顺序为 (签名, 消息, 公钥)。
4.种子(seed)与私钥混为一谈
将 32 字节的种子直接当作私钥使用种子需通过 Ed25519 的 key expansion 算法(SHA-512)生成私钥Ed25519 私钥生成过程:种子 → SHA-512 → 前 32 字节 clamp 后作为私钥。直接使用种子会跳过 clamp 步骤,导致生成的公钥与标准实现不兼容。
5.签名时未对消息做规范化处理
对带 BOM 的 UTF-8 文件直接签名先移除 BOM 或统一使用无 BOM 的 UTF-8 编码Ed25519 签名的是字节序列,BOM(0xEF BB BF)会改变消息的原始字节。同一文本有/无 BOM 会得到不同签名,导致验证失败。
6.混淆 Ed25519 与 EdDSA 的其他变体(如 Ed448)
将 Ed448 生成的 57 字节公钥输入到 Ed25519 工具确认密钥对是 Ed25519 曲线(Curve25519),而非 Ed448(Goldilocks 曲线)EdDSA 是一族算法,Ed25519 和 Ed448 使用不同椭圆曲线和密钥长度。公钥长度(32 vs 57 字节)和签名长度(64 vs 114 字节)均不同,混用会导致解码或验证失败。
7.密钥生成时未检查随机数质量
从伪随机数生成器(如 JavaScript Math.random())取种子使用密码学安全随机数生成器(如 window.crypto.getRandomValues 或 /dev/urandom)Ed25519 安全性依赖种子的不可预测性。Math.random() 是伪随机且可预测,攻击者若知道种子生成时间即可还原私钥。标准要求使用 CSPRNG。
8.签名时误用非确定性随机数(nonce)
在签名函数中手动传入随机 nonce让 Ed25519 实现自动生成确定性 nonce(基于私钥和消息的 SHA-512)Ed25519 标准(RFC 8032)使用确定性签名:nonce 由私钥和消息哈希派生,无需外部随机数。手动传入随机 nonce 可能引入重复 nonce 攻击,泄露私钥。
sk = H(seed) ; pk = sk · B
seed32 字节随机种子,私钥生成源HSHA-512 哈希函数,输出 64 字节sk私钥标量,H(seed) 前 32 字节经修剪BEd25519 基点,固定椭圆曲线点pk公钥,sk 与基点 B 的标量乘法结果取 32 字节 seed = 0x4c…a1(十六进制)。H(seed) 得 64 字节,取前 32 字节并执行位修剪(清低 3 位、置高 7 位、清第 255 位)得 sk = 0x30…c8。计算 pk = sk · B,结果 32 字节公钥 = 0x3b…7a。该公钥对应唯一私钥,用于 Ed25519 签名验证。
本工具生成的密钥对输出为 PEM 格式文本,这是 SSH、OpenSSL 等标准工具通用的格式。私钥以 `-----BEGIN PRIVATE KEY-----` 开头,公钥以 `-----BEGIN PUBLIC KEY-----` 开头。直接复制 PEM 全文(包括首尾行)即可粘贴到服务器配置文件或代码变量中使用。注意私钥文件通常需要设置 600 权限(仅所有者可读写),公钥可以公开分发。
Ed25519 是 EdDSA 签名算法的一种具体实现,相比 RSA 2048/4096 有三个核心差异:一是签名速度快约 10-20 倍;二是密钥体积小(公钥 32 字节,私钥 64 字节,PEM 编码后约 100 行 vs RSA 的 20 多行);三是安全性更高,同等安全强度下 Ed25519 密钥长度远小于 RSA。目前 SSH、OpenSSL 1.1.1+、TLS 1.3 都已原生支持 Ed25519,推荐新项目优先使用。
本工具由后端服务器(Go 语言)处理密钥生成,通常 < 1 秒完成。如果页面无响应,先检查浏览器控制台是否有网络报错(F12 → Console 或 Network 标签)。最常见的原因是本地网络代理或防火墙拦截了 `/jiami/ed25519` 接口的 POST 请求。可尝试关闭代理或切换网络重试。如果持续失败,刷新页面后再次点击生成即可,生成过程不依赖浏览器缓存。
私钥仅由后端 Go 程序在内存中生成,生成完毕后立即通过 HTTP 响应返回给浏览器,服务器端不会落盘存储任何密钥。每次生成请求都是独立的,请求结束后内存即释放。但请注意网络传输过程——如果页面使用的是 HTTP 而非 HTTPS,私钥可能在传输链路中被截获。本工具页面全站 HTTPS,传输层加密,可放心使用。
Ed25519 密钥对本身没有内置有效期,只要私钥未泄露、未丢失,理论上可以永久使用。实际运维建议与安全策略挂钩:如果用于 SSH 登录,建议每 6-12 个月轮换一次;用于代码签名或 TLS 证书,则遵循证书颁发机构的有效期(通常 1-2 年)。本工具生成的是裸密钥对,不含证书或有效期字段,轮换周期由使用者自行决定。
Ed25519 依赖较新的加密库支持。OpenSSH 6.5 以下、OpenSSL 1.0.2 以下、Java 8 原生库、GnuPG 2.1 以下等旧版本不内置 Ed25519 算法。如果你需要兼容这些老系统,建议使用 RSA 2048 或 ECDSA P-256。本工具生成的密钥是标准格式,如果目标系统报错 'unknown key type' 或 'invalid algorithm',说明对方软件版本过旧,需要升级或改用其他算法。
本工具每次点击生成仅产生一对密钥(1 私钥 + 1 公钥),不提供批量生成接口。如果需要批量生成,建议使用命令行工具 `ssh-keygen -t ed25519` 配合循环脚本。批量场景下,每个密钥对的随机种子需独立(避免重复),建议在脚本中为每个密钥指定不同的注释或文件名。本工具设计为单次使用场景,适合临时生成或测试用途。
PEM 格式的密钥内容本身就是 Base64 编码的二进制数据,看起来像随机字符是正常现象,并非错误。你可以通过首尾标记行确认格式是否正确:私钥以 `-----BEGIN PRIVATE KEY-----` 开头,公钥以 `-----BEGIN PUBLIC KEY-----` 开头。如果需要验证密钥是否配对,可将公钥导入 SSH 服务器,用私钥尝试连接,能成功登录即说明配对正确。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。