主页 > imtoken无法提币 > 2021 年,以更现代的方式使用 PGP(中)

2021 年,以更现代的方式使用 PGP(中)

imtoken无法提币 2023-03-19 07:34:40

世界上有两种密码:一种是防止你的小妹妹偷看你的文件;另一个是防止当局阅读您的文件。

​——Bruce Schneier,《应用密码学》

2021年,以更现代的方式使用PGP(中)上一篇文章链接:

2021 年,以更现代的方式使用 PGP (in)

三、安全使用和备份准备

为了安全起见,建议在断开连接的 Linux 或 BSD 系统上生成您的密钥对。

特别推荐使用 Tails (boum.org) 分发版。系统自带gpg、paperkey等工具,可以保证整个网络的断网操作。同时,本次系统重启会抹去所有内容,也免去了抹除钥匙的麻烦。所需工具:

备份策略

我的备份策略:

建议将主密钥备份在完全加密的U盘中,然后放在绝对安全的地方。

备份介质:智能卡

不建议将万能钥匙导入智能卡设备,因为智能卡的使用场景是随身携带,随时使用。智能卡中的钥匙虽然不能导出,但随身携带会增加丢失的风险,一旦万能钥匙丢失,会很麻烦。

如果你是土豪,当然最好是导入智能卡,因为智能卡里面的密钥不能导出,但是智能卡不能再随身携带了,应该也在安全的地方。使用,不过这样有点浪费,不推荐。

在线磁盘存储

您可以将主私钥加密后上传到网盘或其他在线服务。

纸钥匙

是断网操作,非对称算法,必须妥善保管私钥。经过这个过程,你也发现它类似于数字货币。许多备份方法可以借鉴他们的想法。比如上面的在线存储就是数字货币热钱包的思路。

一个非常经典的冷钱包方式是在纸上写/打印私钥。当然我们也可以借鉴一下,但是如果你想把这个看不见的私钥抄下来,或者以后需要恢复的时候把它打印出来再一个一个输入电脑,显然是不现实的.

image-20210113111654636

(部分示例私钥,用完后失效,如果是自己的私钥,杀了不要给别人看)

比如比特币,私钥只要这样:

5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss          # 这么短很容易抄写和输入

也是非对称算法,为什么PGP私钥这么长?

因为他们使用的算法不同,比特币默认使用ECDSA的secp256k1算法必须买整个比特币才有密钥ma,只用于签名和鉴权,不用于加密(很多科普文章会说这是加密算法,比特币的算法可以也可以用于加密,这是错误的,比特币有时被称为加密货币的原因只是因为它依赖于密码学中的非对称算法,不能加密......),PGP默认使用RSA算法可以用于签名和加密同时进行。前面提到,为了安全起见,目前的 RSA 密钥长度不少于 2048 位,而 PGP 导出的私钥不仅包含密钥信息,还包含所有的公钥信息、UID、子密钥密钥信息,以及设置密码时的混乱。

Linux下有个叫paperkey的工具,可以用来消除私钥中多余的公钥信息,大大减少私钥的长度,然后把简化的私钥(base 16格式)打印出来,或者将Raw格式转换成二维码打印出来。

注意:

其他

密钥只是一条信息,理论上可以放在任何其他可以存储信息的介质中,比如CD,隐写在图片中,写IC卡,纹身,X光片,记忆它等等等等,你可以发挥你的想象力。

安全使用

请在您信任的计算机上使用子密钥。除非绝对必要,否则不应使用万能钥匙。如果您使用智能卡中的子密钥,则可以忽略这部分。

子密钥可以直接在移动存储设备上使用,无需复制/导入电脑。使用方法:

gpg --homedir [你的存储设备的路径]

四、其他算法的高级使用和使用

在小节中提到了 PGP 支持的算法很多,但是我们之前生成密钥的时候只看到了几个。

因为gpg还有一个隐藏模式——专家模式,生成key的时候可以使用

gpg --expert --full-gen-key
# 输出
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
   (9) ECC and ECC
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (13) Existing key
  (14) Existing key from card
  

你可以看到更多选项,其中ECC算法被称为Elliptic Curve Cryptography 椭圆曲线密码算法。

上面我选了9,继续

  Please select which elliptic curve you want
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256   
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1            # 比特币使用的算法

其中美国国家标准与技术研究院 (NIST) 系列椭圆曲线、Brainpool 系列椭圆曲线和 secp256k1 存在不同的安全风险,不推荐使用。

可以发现这里少了(2),其实这里还有一些隐藏的算法没有列出来,可以通过下面的命令查看

gpg --list-config --with-colons curve
# 输出
cfg:curve:   cv25519;ed25519;nistp256;nistp384;nistp521;brainpoolP256r1;brainpoolP384r1;brainpoolP512r1;secp256k1

缺少的(2)对应ed25519是一个签名算法,当你选择(1),主密钥用于签名,签名是ed25519,自动生成)使用的子密钥算法用于加密的是 cv25519。

RSA VS ECC

ECC 算法相对于 RSA 的优势在于,在同等强度下,ECC 的密钥长度要小得多,性能会更好。 RSA算法的PGP私钥经过paperkey简化后一般会有50+行HEX数据。如果用ECC算法生成的话,可以减少到8行以内,手抄也没问题。

RSA算法的优点是大多数硬件设备的兼容性都比较好。例如,YubiKey 5 支持 RSA 4096,但不支持 Curve 25519。而且大多数设备都为 RSA 算法提供了硬件加速。

PS:

查资料的时候发现很多人抄了中文博客里的一句话:

ed25519加解密速度快,生成时间短安全性更高,rsa加解密稍慢必须买整个比特币才有密钥ma,生成时间长,安全性不如ed25519高,但是rsa基本是默认的,所以用的人比较多,不过建议转成ed25519,现在网站软件基本都支持了。

这句话错了,ed25519是一种EdDSA算法,只是一种签名算法,EdDSA全称Edwards-curve Digital Signature Algorithm,爱德华椭圆曲线实现的数字签名算法。

以上文字多出现在用ed25519替换SSH默认RSA算法的文章中。事实上,SSH协议中的非对称算法并不是用来加密和解密信息,而只是用于认证。正确的说法是ed25519签名和认证速度很快。

此外,RSA 4096 的安全强度比 ed25519 的要好,不提密钥长度。

附加 UID

uid为用户id,由三部分组成:

UID 的性质:

一般情况下,只有万能钥匙才有权限操作UID,后面会提到。可以伪造 UID,然后提交给服务器。

gpg --edit-key {keyid/uid}    
gpg> adduid     # 进入交互界面后 输入  help  可以查看支持的操作
# 输入你要追加的信息

使用 UID 有哪些场景?如果您使用不常见的电子邮件作为您的 github/gitlab 帐户,则您的主电子邮件生成的 PGP 密钥不能用于签名。

此时为了保护隐私只需要管理一个key,可以在Github设置中勾选Keep my email addresses private,并将为你生成的随机邮箱添加到uid中,这样你只需要管理可以同时签署不同 Git 帐户的 PGP 密钥。

添加头像

这类似于添加 UID。可以在gpg交互界面输入addphoto。如果要查看,请输入 showphoto。

使用 PGP 签署 git commit

只要你的 PGP uid 包含 git config 中的邮箱,使用

git commit -S -m 你的提交信息

签名。

使用 PGP 进行 SSH 生成带有子密钥的身份验证 (A)

gpg --expert --edit-key {keyid/uid}                                   ## 使用专家模式, 不然没有认证的选项
gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
Your selection? 8                                                   ## 选8, RSA, 自定义权限
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt                               ## 这里显示默认有Sign和Encrypt两种权限
   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished
Your selection? S                                                   ## 关闭Sign
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt
   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished
Your selection? E                                                   ## 关闭Encrypt
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions:
   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished
Your selection? A                                                   ## 开启Authenticate
Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Authenticate
   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished
Your selection? Q                                                    ## 退出
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
        = key expires in n days
      w = key expires in n weeks
      m = key expires in n months
      y = key expires in n years
Key is valid for? (0) 1y                                             ## 有效期
Key expires at Tue Jan  7 11:33:54 2020 CST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
sec  rsa2048/7DEFA5351BCE3C55
     created: 2019-01-07  expires: 2021-01-06  usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa2048/2FCE923F8ECB63F6
     created: 2019-01-07  expires: 2021-01-06  usage: E
ssb  rsa4096/19D32A8839DCAA1F
     created: 2019-01-07  expires: 2020-01-07  usage: A
[ultimate] (1). hhhhh 
gpg> save                                                            ## 保存

配置文件

编辑 bashrc 文件,用 gpg-agnet 替换默认的 ssh 代理

#  ~/.bashrc
export GPG_TTY=$(tty)
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
echo UPDATESTARTUPTTY | gpg-connect-agent 1> /dev/null

编辑 ~/.gnupg/gpg-agent.conf 文件并添加:

#  ~/.gnupg/gpg-agent.conf
enable-ssh-support

下一步:

❯ gpg -k --with-keygrip    
/Users/root/.gnupg/pubring.kbx
-----------------------------
pub   rsa2048 2019-01-07 [SC] [expires: 2021-01-06]
      8A9FC025A44AA4824C1F4AE27DEFA5351BCE3C55
      Keygrip = BEFCCDFE36CC5442B888B8459265C68B60A4ABD2
uid           [ultimate] hhhhh 
sub   rsa2048/0xF681DAEBBAB82124 2019-01-07 [E] [expires: 2021-01-06]
      Keygrip = 422922ACFD099E79863D93B93333528F225C90FC
sub   rsa2048/0x501DEDC36BD409C8 2019-01-07 [A] [expires: 2020-01-07]
      Keygrip = 999A87A51CFE82DAA494BEB42F585051307F9E33

选择你添加的带有[A]标记的那个子键的keygrip,即999A87A51CFE82DAA494BEB42F585051307F9E33

添加到~/.gnupg/sshcontrol文件,运行ssh-add -l查看是否已经添加。

然后

gpg --export-ssh-key   {keyid}! 

注意这里不能使用uid,否则会提示:

gpg: key "uid" not found: Unusable public key
gpg: export as ssh key failed: Unusable public key

这里只能填写子key的key id,本例为0x501DEDC36BD409C8。

输出的ssh公钥放在你服务器的~/.ssh/authorized_keys中,重启shell,就可以连接了。

待续