Python Paramiko - 确定可用的加密算法和密钥交换算法

10
我有一个使用Paramiko库编写的Python自动化SFTP程序。如果我建立了连接,我可以展示传输所使用的密码和密钥交换算法。然而,我不确定这些算法和密码是否是“可用”的算法和密码。
示例:
>>> import paramiko
>>> ssh = paramiko.SSHClient()
>>> ssh.load_system_host_keys()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect("myhost.example.com", 22, username="xyzzy")
>>> t = ssh.get_transport()
>>> so = t.get_security_options()
>>> so.kex
('diffie-hellman-group14-sha1', 'diffie-hellman-group-exchange-sha1', 'diffie-hellman-group1-sha1')
>>> so.ciphers
('aes128-ctr', 'aes256-ctr', 'aes128-cbc', 'blowfish-cbc', 'aes256-cbc', '3des-cbc', 'arcfour128', 'arcfour256')

这是否与“可用的”内容相同?如果不是,有没有办法以编程方式确定可用性?

1个回答

6
Transport.get_security_options() 返回的SecurityOptions是:
简单的对象,包含ssh传输的安全偏好设置。 这些是可接受的密码,摘要,密钥类型和密钥交换算法的元组,按优先顺序列出。
所以它列出了Paramiko库支持的密码和密钥交换算法(或您配置/允许的子集)。
这就是您(和Paramiko)为连接提供的内容。
实际上使用的是服务器还支持的最优先密码/密钥交换算法(根据您的术语也是“可用的”)。
获取支持的算法列表,无需连接,可以使用以下方法:
import paramiko
import socket

opts = paramiko.transport.Transport(socket.socket()).get_security_options()
print(opts.ciphers)
print(opts.kex)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接