Melt
使用记忆种子短语备份和还原SSH私钥。
安装
包管理器
# macOS或Linux
brew install charmbracelet/tap/melt
# Arch Linux (btw)
yay -S melt-bin
# Windows (使用Scoop)
scoop bucket add https://github.com/charmbracelet/scoop-bucket.git
scoop install melt
# Nix
nix-env -iA nixpkgs.melt
# Debian/Ubuntu
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
sudo apt update && sudo apt install melt
# Fedora/RHEL
echo '[charm]
name=Charm
baseurl=https://repo.charm.sh/yum/
enabled=1
gpgcheck=1
gpgkey=https://repo.charm.sh/yum/gpg.key' | sudo tee /etc/yum.repos.d/charm.repo
sudo yum install melt
您也可以从发行版页面下载二进制文件或软件包。
Go
也可以使用go
安装:
go install github.com/charmbracelet/melt/cmd/melt@latest
构建(需要Go 1.17+)
git clone https://github.com/charmbracelet/melt.git
cd melt
go build ./cmd/melt/
用法
CLI用法如下:
# 从SSH密钥生成种子短语
melt ~/.ssh/id_ed25519
# 从标准输入的SSH密钥生成种子短语
cat ~/.ssh/id_ed25519 | melt
# 使用种子短语重建密钥
melt restore ./my-key --seed "种子短语"
# 使用种子短语重建密钥并输出到标准输出
cat words | melt restore -
您还可以通过文件进行输入输出:
melt ~/.ssh/id_ed25519 > words
melt restore ./recovered_id_ed25519 < words
工作原理
这一切都归结于私钥__种子__:
Ed25519密钥开始于32字节(256位)的随机二进制种子(例如对某些随机输入使用SHA256)。然后使用SHA512对种子进行哈希运算,得到64字节(512位),并将其拆分为"左半部分"(前32字节)和"右半部分"。将左半部分修改一些高/低位后,即得到曲线25519私密标量"a"。公钥通过将此秘密标量乘以"B"(生成元),得到32字节/256位的群元素"A"。1
知道这一点后,我们打开密钥并提取其种子,将其用作bip39算法的__熵__,该算法规定:
助记词必须以32位为单位编码熵。熵越多,安全性越高,但句子长度也越长。我们将初始熵长度称为ENT。ENT的允许大小为128-256位。2
这样做,我们就得到了__助记词__单词集。
要还原,我们:
- 从__助记词__获取__熵__
- 熵__实际上是密钥__种子,因此我们使用它创建一个SSH密钥对
- 密钥实际上与备份的密钥相同,因为密钥是相同的。 你可以通过检查公钥指纹来验证密钥,它应该在原始和__还原__的密钥中相同。
注意事项
- 目前仅支持
ed25519
密钥。 - 如果您的公钥有备注(通常是生成它的user@host),这些信息将丢失。 稍后可以手动添加此信息(或任何其他信息)到公钥中,因为它实际上不用于签名/验证。
- 由于随机块,您的私钥的某些字节可能会发生变化。但密钥实际上是相同的。
还原备注
我们可以使用ssh-keygen
为还原的密钥添加备注。
如果您运行以下命令来还原密钥:
melt restore ./my-key --seed "witness shoe deputy celery debate myth \
title sign dish bone powder velvet reveal midnight blast mobile \
valid cycle announce valid item interest cinnamon cake"
正在将密钥还原到./my-key和./my-key.pub...
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
成功将密钥还原到./my-key和./my-key.pub
您可以验证没有备注:
cat my-key.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKThPEoe20Wi5zAfyI+gTrTMnODbRtYtQRUZYIvfV19C
在还原的密钥上运行此命令:
ssh-keygen -c -C melted-again@charm.sh -f ./my-key
Old comment:
Comment 'melted-again@charm.sh' applied
查看备注已设置:
cat my-key.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKThPEoe20Wi5zAfyI+gTrTMnODbRtYtQRUZYIvfV19C melted-again@charm.sh
反馈
我们很乐意听到您对这个项目的想法。欢迎随时联系我们!
许可证
Charm项目之一。
Charm热爱开源
Footnotes
-
Warner, Brian. Ed5519密钥如何工作? (2011) ↩
-
Palatinus, Marek等人. 生成确定性密钥的助记码 (2013) ↩