piapia123
zh

SSH 密钥

编码

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

两种用途,在选项里切换。 解析:把 `~/.ssh/id_ed25519.pub` 的那一行粘进来,得到类型、位数、SHA-256 与 MD5 两种指纹、注释,以及行首的 `authorized_keys` 选项(`command=`、`from=` 那些)。指纹是这个工具最主要的用途 —— 服务器上的 `ssh-keygen -lf` 与本地这份对不对得上,是判断「换没换过钥匙」的标准做法。 ⚠️ 指纹算的是 base64 解出来的那整段二进制,不是 base64 文本,也不是其中某个字段。算错了不会报错,只会得到一个对不上的值 —— 而指纹的全部用途就是「对得上」。这就是为什么这里给的两个指纹都是拿 `ssh-keygen` 的输出当测试基准的。 ⚠️ MD5 是旧格式(`ssh-keygen` 从 6.8 起默认改用 SHA-256)。这里给出来是因为不少老服务器、老文档与老管理界面还在印它 —— 两边对不上时,先确认看的不是同一种格式。 生成:选类型与注释,在浏览器里生成一对密钥。⚠️ 私钥是标准 PKCS#8 PEM,不是 OpenSSH 自己的格式(那个用 bcrypt_pbkdf,不在浏览器里)—— 所以结果里给了转格式的命令,并提醒你现在就复制走:关掉页面就没了。全部在浏览器本地完成,密钥不上传。

功能

  • 解析公钥:类型、位数、注释,以及 `authorized_keys` 行首的选项
  • ⚠️ SHA-256 与 MD5 两种指纹,都与 `ssh-keygen -lf` 的输出逐字符一致
  • ⚠️ 说明 MD5 是旧格式 —— 两边对不上时先确认格式
  • ⚠️ RSA 的位数从 blob 里的模数数出来,不是从 base64 长度估
  • 带选项的行(`command="echo a b",no-pty ssh-ed25519 …`)不会被按空格切碎
  • 生成 Ed25519 或 RSA 2048 / 3072 / 4096
  • ⚠️ 生成的私钥是 PKCS#8 PEM,并给出转成 OpenSSH 格式的命令(bcrypt_pbkdf 不在浏览器里)
  • ⚠️ 提醒「密钥只在浏览器内存里,关掉页面就拿不回来了,现在就复制」
  • 生成后把公钥再解析一遍自校验 —— 保证「生成的」与「读出的」对得上
  • 全部在浏览器本地完成,密钥不上传也不存储

使用方法

  1. 解析:把公钥那一行粘进去(从 `~/.ssh/id_ed25519.pub` 整行复制)
  2. 生成:把「做什么」切成生成,选类型、填注释
  3. 解析的结果里,指纹那一行拿去掉服务器上 `ssh-keygen -lf` 对照即可

常见问题

两个指纹为什么不一样?该看哪一个?
因为它们是同一个东西的两种写法:都算整个 base64 解出来的二进制,只是一个用 SHA-256、一个用 MD5。该看 SHA-256 —— `ssh-keygen` 从 OpenSSH 6.8(2014 年)起就默认改用它了,而 MD5 已经不该用于任何安全判断。这里给 MD5 是因为不少老服务器、老文档与老管理界面还在印它,而两边格式不同时会让人以为钥匙不对。对不上时先看前缀(`SHA256:` 还是 `MD5:`)。
为什么生成的私钥不能直接给 ssh 用?
因为 `ssh-keygen` 生成的新式私钥(`-----BEGIN OPENSSH PRIVATE KEY-----`)用了 bcrypt_pbkdf 来从口令派生加密密钥,而那个 KDF 不在浏览器的加密接口里 —— 网页里做不出来。所以这里给的是标准的 PKCS#8 PEM,结果里附了用 `ssh-keygen -p -m pem` 转换的命令。假装能生成 `.ssh/id_ed25519` 那种文件,会让人以为复制过去就能用,而 ssh 只会报一个格式错误。
`authorized_keys` 前面的那串选项是什么?
那是对这把钥匙的限制,粘贴时不能丢。常见的几个:`command="..."` 让这把钥匙只能执行那一条命令(部署密钥的常用做法)、`from="10.0.0.*"` 限制来源 IP、`no-pty` 禁止分配终端、`no-port-forwarding` 禁止端口转发。丢掉它们等于把这把钥匙的权限放大到了没有限制 —— 而这正好是当初加它们要防的事。
Ed25519 和 RSA 该选哪个?
Ed25519,除非有兼容性约束。它更短(公钥 68 个字符、RSA 2048 是 500 多个)、签名更快、而且没有 RSA 那些参数选择上的坑。RSA 仍有用的场合是老的服务器或设备不认 Ed25519 —— 那时候用 3072 位以上,2048 位按现在的标准已经偏短了。
生成的密钥安全吗?
密钥由浏览器的 `crypto.subtle.generateKey` 生成,用的是系统的密码学安全随机源,强度是够的。风险不在生成环节,而在你把它存到哪里:不要提交进 Git(一次提交就永远留在历史里,删掉也没用)、不要贴进聊天工具、不要用云盘同步。开发机上用完可以随时删掉重新生成 —— 反正只要几秒钟。公钥没有这些顾虑,它本来就是要公开的。

相关工具