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@Resource和@Autowired返回null,带有方面日志   如何从Java算法的无序字符串中检索原始字符串   如何在Java文本区域中显示多行扫描仪输入   java如何迭代一个arraylist并将符合条件的某些对象复制到另一个arraylist?   在java中存储矩阵并进行比较   使用BND工具的java Gradle多构建平面独立项目   读取java时文件名中的随机字符   java JDBC准备的语句UTF8   java如何在web的子项目中包含源程序包。主项目中的xml   Spring MVC、Tomcat和mysql的java开发环境   java Mous类OnClick侦听器错误   左起第二斜杠后的java剪切字符串   java TestNG处理外部系统依赖关系,需要澄清   java如何在JUnit测试类中注入多个EJB   java无法将“”解析为整数,然后退出   具有HashMap返回空HashMap的java装饰器设计模式   apache和Java之间的“解密失败或坏记录mac”   java在运行基于Spring的应用程序时如何解析占位符?   java swing/batik的奇怪行为   tostring Long在java中不会转换为字符串