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

Python Paramiko - Determine what ciphers and key-exchange algorithms are available

我有一个使用 Paramiko 库用 Python 编写的自动化 SFTP 程序。如果我建立连接,我可以显示传输使用的是什么密码和密钥交换算法。但是,我不确定这与 available.

的算法和密码是否相同

示例:

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

这与可用相同吗?如果不是,是否有任何方法可以确定以编程方式可用的内容?

Transport.get_security_options()返回的SecurityOptions class是:

Simple object containing the security preferences of an ssh transport. These are tuples of acceptable ciphers, digests, key types, and key exchange algorithms, listed in order of preference.

因此它列出了 Paramiko 库支持的密码和 kex 算法(或您拥有的子集 configured/allowed)。

是的,您(和 Paramiko)正在为连接提供可用

最终使用的是最受青睐的cipher/kex算法,也是支持的(可用条款)由服务器。


要获取支持的算法列表,无需连接,您可以使用:

import paramiko
import socket

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