如何检查 SSH 私钥是否有密码?

信息安全 公钥基础设施 SSH 密码
2021-08-29 03:23:54

假设我可以访问 RSA 密钥对的私有部分。如何检查此密钥是否具有关联的密码?

4个回答

如果受密码保护,密钥文件将具有不同的标题。这是没有密码的密钥的顶部:

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA3qKD/4PAc6PMb1yCckTduFl5fA1OpURLR5Z+T4xY1JQt3eTM

这是受密码保护的密钥的顶部:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,556C1115CDA822F5

AHi/3++6PEIBv4kfpM57McyoSAAaT2ECxNOA5DRKxJQ9pr2D3aUeMBaBfWGrxd/Q

不幸的是,这只适用于查看文件。我知道服务器无法判断提供给它的密钥是否受密码保护,这是能够利用此类信息的最有用的地方。

它并不总是像其他答案中描述的那么容易。它仅适用于旧的 PEM 密钥。如果您检查标题,则密钥的openssh格式(使用选项生成,更安全,因为 openssh-6.5)看起来相同:-o

$ head rsa_enc
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABCYdi7MhY
$ head rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn

在这种情况下,最简单的方法是使用ssh-keygen. 如果它会要求输入密码,它有一个(或者它不是 ssh 密钥),如果不是,它没有密码:

$ ssh-keygen -yf rsa_enc
Enter passphrase: 
$ ssh-keygen -yf rsa
ssh-rsa AAAAB3NzaC1y...

下面的例子可能更好,因为它不要求输入: -P 指定要使用的密码,一个未受保护的密钥以空密码打开。

$ ssh-keygen -y -P "" -f rsa_enc
Load key "path_to_key": incorrect passphrase supplied to decrypt private key`
$ ssh-keygen -y -P "" -f rsa
ssh-rsa AAAAB3NzaC1y...

“RSA 密钥”实际上是以标准化 DER 二进制格式存储为 ASN.1 结构的一组值,然后以 base-64 编码以获得最终的 PEM 文件。

确定密钥是否已编码的一种非常简单的方法是检查 ASN.1 标头是否存在,这通常就像检查“密钥”是否以字母开头一样简单,MII如下例所示:

-----开始 RSA 私钥-----
MII CWwIBAAKBgQCWxk9djtgA/t7n6M8g1d2fk3exyCSu1uubpxUkoFLJBKjLYiaa
[...]
eCrpRFHxhPICHI4db+I8GZ9QDmlbCN/bl3BBNNTn3w==
-----结束 RSA 私钥-----

在受密码保护的文件中,整个 ASN.1 结构被加密,它都显示为随机字符。

私钥应该是安全的,尝试设置密码只是声明它是否还受密码保护。ssh-keygen受保护的密钥上:

~/.ssh$ ssh-keygen -p -f id_rsa_password_protected
Enter old passphrase:

并且不受保护:

~/.ssh$ ssh-keygen -p -f id_rsa_not_protected
Enter new passphrase (empty for no passphrase):

因此,如果它没有密码保护,只需设置密码