ssh公钥分析器

sshpubkeys的Python项目详细描述


https://travis-ci.org/ojarva/python-sshpubkeys.svg?branch=master

版本2和版本3之间的主要更改

  • 放弃了对Python2.6和3.3的支持
  • 即使在宽松模式下,dsa密钥也必须是10242048或3072位(之前这是宽松的)
  • 接口(api)完全相同

用法

用于验证openssh公钥的本机实现。

目前支持带有nist曲线的ssh rsa、ssh dss(dsa)、ssh-ed25519和ecdsa密钥。

安装:

pip install sshpubkeys

或者克隆repository并使用

python setup.py install

用法:

import sys
from sshpubkeys import SSHKey

ssh = SSHKey("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAYQCxO38tKAJXIs9ivPxt7AY"
      "dfybgtAR1ow3Qkb9GPQ6wkFHQqcFDe6faKCxH6iDRteo4D8L8B"
      "xwzN42uZSB0nfmjkIxFTcEU3mFSXEbWByg78aoddMrAAjatyrh"
      "H1pON6P0= ojarva@ojar-laptop", strict=True)
try:
    ssh.parse()
except InvalidKeyError as err:
    print("Invalid key:", err)
    sys.exit(1)
except NotImplementedError as err:
    print("Invalid key type:", err)
    sys.exit(1)

print(ssh.bits)  # 768
print(ssh.hash_md5())  # 56:84:1e:90:08:3b:60:c7:29:70:5f:5e:25:a6:3b:86
print(ssh.hash_sha256())  # SHA256:xk3IEJIdIoR9MmSRXTP98rjDdZocmXJje/28ohMQEwM
print(ssh.hash_sha512())  # SHA512:1C3lNBhjpDVQe39hnyy+xvlZYU3IPwzqK1rVneGavy6O3/ebjEQSFvmeWoyMTplIanmUK1hmr9nA8Skmj516HA
print(ssh.comment)  # ojar@ojar-laptop
print(ssh.options_raw)  # None (string of optional options at the beginning of public key)
print(ssh.options)  # None (options as a dictionary, parsed and validated)

解析授权密钥文件:

from sshpubkeys import AuthorizedKeysFile

key_file = AuthorizedKeysFile("""ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEGODBKRjsFB/1v3pDRGpA6xR+QpOJg9vat0brlbUNDD\n"""
           """#This is a comment\n\n"""
           """ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAF9QpvUneTvt8"""
           """lu0ePSuzr7iLE9ZMPu2DFTmqh7BVn89IHuQ5dfg9pArxfHZWgu9lMdlOykVx0I6OXkE35A/mFqwwApyiPmiwno"""
           """jmRnN//pApl6QQFINHzV/PGOSi599F1Y2tHQwcdb44CPOhkUmHtC9wKazSvw/ivbxNjcMzhhHsWGnA=="""
           strict=True, disallow_options=True)
for key in key_file.keys:
    print(key.key_type, key.bits, key.hash_512())

选项

将构造函数中的选项设置为关键字(即sshkey(none,strict=false)

  • 严格:默认为true。不允许密钥openssh的ssh keygen拒绝创建。例如,这包括dsa密钥长度!=1024位,RSA密钥小于1024位。如果设置为false,则尝试允许openssh接受的所有密钥,包括高度不安全的1位dsa密钥。
  • skip_option_parsing:如果设置为true,则不分析选项字符串(ssh.options_raw已填充,但ssh.options未填充)。
  • 不允许选项:如果设置为true,则不允许选项,它将引发 无效选项错误。

例外情况

  • 如果遇到无效的ecdsa曲线或未知的密钥类型,则为notimplementederror。
  • 如果遇到任何其他错误,则无效键错误:
    • 如果密钥太短(rsa为768位,<;1024 dsa为1024位,<;256 ed25519为256位)
    • toolongkeyerror如果密钥太长(rsa为16384,dsa为1024,ed25519为256)
    • 如果密钥类型(上例中的“ssh rsa”)与base64编码数据中包含的内容不匹配,则为invalidtypeerror。
    • 如果解码和提取数据失败,则返回格式错误的ddataerror。
    • 如果选项字符串无效,则无效选项错误。
      • 如果选项名称包含无效字符,则返回invalidoptionnameerror。
        • 如果无法识别选项名,则返回UnknownOptions名称错误。
      • MissingMandatoryOptionValueerror如果选项需要参数,但它不存在。

测试

有关单元测试,请参见“tests/”文件夹。使用

python setup.py test

python3 setup.py test

运行测试套件。如果您有未正确解析的密钥,或者格式不正确的密钥导致不正确的异常,请将您的public key发送到olli@jarva.fi,我将包含它。或者,create a new issue或在github中生成a pull request

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java的单元测试测试用例库。util。列出实现   java通过超类进行序列化/反序列化   java Android获取设备语言ISO字符串   java如何打开广告的行动。移动   Eclipse IDE for(嵌入式C/C++)开发者202012:经典的深色主题深黑色背景和菜单中的文本   java使用不同的内容动态创建TableView(JavaFX)   java JAXB将多个同名节点解组   java ClassDefNotFoundException,即使类由类加载器加载(服务器上安装了多个应用程序)   java有没有办法关闭在后端生成的MqttClient线程?   html如何在网站上的java小程序中包含图像?   java无法访问已分配给超类引用的子类实例变量   java在TableViewer中双击打开对话框   列出如何创建ListNode。JAVA   java如何从文本中输出的数组中放入随机图像