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

评论

尝试使用它

@Ayozint现在,坐下来等待有关如何为此目的设置虚拟ssh服务器以及如何在匹配要求密码的字符串后从脚本中过早地杀死ssh进程的问题。

#1 楼

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

-----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


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

评论


基于时间的解决方案可能会起作用。如果是未加密的密钥,通常在服务器发送质询后立即发送响应,对于已加密的密钥,用户至少需要几秒钟的时间才能输入密码来解密密钥。

–AndréBorie
16年7月12日在0:04

@AndreBorie,很遗憾,客户无法信任。如果密钥代理正在缓存(分阶段)密钥,则正常使用可能没有延迟,并且恶意客户端可能会引入假延迟来“模拟”解锁密钥... 20年前,我们通过“时序分析telnet等协议上输入密码)

– gowenfawr
16年7月12日在0:25

更一般而言,密钥加密完全是客户端操作。如果您想知道密钥是加密的,则它需要在服务器端存在并解密。但是随后,服务器具有解密的私钥,这使非对称密码学变得无效。

–凯文
16年7月12日在4:08

这个答案是不正确的(不再)。没有显示proc-type和DEK标头的私钥可以很好地加密。

– GerardJP
19年2月7日在13:27

@GerardJP我将答案解释为,如果缺少proc-type和DEK标头行,则表示它没有密码保护。我不认为这是在讨论是否对某些内容进行加密。

–更好
19/12/20在22:03

#2 楼

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

这种情况是使用ssh-keygen对它们运行一些操作。如果它要求输入密码,则它具有一个密码(或者不是ssh密钥),如果不要求则不具有密码:下面的示例,因为它不要求输入:
-P指定要使用的密码,将打开一个未受保护的密钥,并带有空密码。


评论


更加安全,但兼容性较差:他们意识到以下事实:已知的ASN.1结构也经过加密,以助于蛮力攻击,因此省略了标准存储来创建自己的存储格式,攻击者可以依靠该格式不了解以前文本。谢谢!

–WhiteWinterWolf
16年7月11日在13:20

但是,以base64编码的数据确实包含有关密钥是否已加密的信息:第一个解码为openssh-key-v1 ..... aes256-cbc .... bcrypt ......... v。 。和第二个解码为openssh-key-v1 ..... none .... none ................ ssh-

–Random832
16年7月11日在15:34

@ Random832你是对的。谢谢。但这并不像在第一种情况下使用ASCII那样明显。

–贾库耶
16年7月11日在15:36

好吧,base64总是将三个输入字符映射到四个输出字符,因此有可能根据文件中该字符串的确切偏移量来发现编码后的非字符或无字符之一。

–乌尔里希·施瓦茨(Ulrich Schwarz)
16年7月12日在5:28

并且在2018年(从7.8开始)中,默认格式为新格式,并且不需要-o(除了带有-m pem的ed25519之外,您仍然可以使用old = OpenSSL格式)FWIW PuTTY具有其自己的'ppk'格式(也是text + base64,但不是PEM),第二行指定是否加密。

–dave_thompson_085
19年2月11日在4:56



#3 楼

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

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


----- BEGIN RSA私钥----- MIICWwIBAAKBgQCWxk9djtgA / t7n6M8g1d2fk3exyCSu1uubpxUkoFLJBKjLYiaa [...]
eCrpRFHxhPICHI4db + I8GZ9W END RSA PRIVATE KEY -----


在受密码保护的文件中,整个ASN.1结构都被加密,全部以随机字符的形式出现。

评论


但是,如果加密的字符串也以MII开头,可能会导致误报?

– Falco
16年7月11日在13:49

@Falco:是的。在实践中,例如,快速检查一组未知密钥是一种很好的尝试,但是对密钥状态(加密,损坏等)具有100%保证的唯一方法是使用所提供的方法在Jakuje的答案中(ssh-keygen -yf )。

–WhiteWinterWolf
16年7月11日在15:12

更简单,更强大:OpenSSL“传统”格式PEM级加密在加密和base64数据之前有两个标题行和一个空白行,如gowenfawr的回答

–dave_thompson_085
19年2月11日在4:52



#4 楼

应该保护私钥,尝试设置密码只是声明是否受密码保护。在受保护密钥上带有ssh-keygen的情况下:

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


而不受保护的情况:没有密码保护,只需设置密码即可。