2011-07-13 12 views
17

Estoy tratando de entender los pasos para tomar una clave pública OpenSSH, así:Obtención de una huella digital SSH desde una clave pública en Python

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqmEmDTNBC6O8HGCdu0MZ9zLCivDsYSttrrmlq87/YsEBpvwUTiF3UEQuFLaq5Gm + dtgxJewg/UwsZrDFxzpQhCHB6VmqrbKN2hEIkk/HJvCnAmR1ehXv8n2BWw3Jlw7Z + VgWwXAH50f2HWYqTaE4qP4Dxc4RlElxgNmlDPGXw/dYBvChYBG/RvIiTz1L + pYzPD4JR54IMmTOwjcGIJl7nk1VjKvl3D8Wgp6qejv4MfZ7Htdc99SUKcKWAeHYsjPXosSk3GlwKiS/sZi51Yca394GE7T4hZu6HTaXeZoD8 + IZ7AijYn89H7EPjuu0iCAa/cjVzBsFHGszQYG + U5KfIw ==

Y a continuación, para convertirlo en un estándar huella digital de este modo:

2048 49:d3:cb:f6:00:d2:93:43:a6:27:07:ca:12:fd:5d:98 id_rsa.pub (RSA) 

He intentado sumergirse en la fuente de OpenSSH para entender esto, pero es sobre mi cabeza. Mi primera suposición fue hacer un MD5 simple en el texto clave, pero el resultado no coincide con el resultado anterior.

+0

La huella digital no es un hash directa de la llave Puede profundizar en la fuente openssh, para ssh-keygen en particular, que tiene el código de extracción de huellas dactilares. Algunos detalles menores aquí: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html –

Respuesta

35

Es la suma MD5 de la clave de cifrado de base64:

import base64 
import hashlib 

def lineToFingerprint(line): 
    key = base64.b64decode(line.strip().split()[1].encode('ascii')) 
    fp_plain = hashlib.md5(key).hexdigest() 
    return ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2])) 
+1

Gracias, esto fue útil. Reemplacé 'line.partition ('ssh-rsa') [2]' con 'line.split() [2]' para manejar anotaciones OpenSSH opcionales como: 'ssh-rsa ..... key ... JohnDoe @ his_laptop' que debe eliminarse. –

+0

@ Adrián Tienes toda la razón, arreglado. Supongo que te refieres a 'split() [1]'. – phihag

+0

oh, sí '[1]' ._. " –

3

https://github.com/ojarva/sshpubkeys

pip install sshpubkeys

Uso:

import sshpubkeys 
key = sshpubkeys.SSHKey("ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqmEmDTNBC6O8H" + 
    "GCdu0MZ9zLCivDsYSttrrmlq87/YsEBpvwUTiF3UEQuFLaq5Gm+dtgxJewg/UwsZrDFxz" + 
    "pQhCHB6VmqrbKN2hEIkk/HJvCnAmR1ehXv8n2BWw3Jlw7Z+VgWwXAH50f2HWYqTaE4qP4" + 
    "Dxc4RlElxgNmlDPGXw/dYBvChYBG/RvIiTz1L+pYzPD4JR54IMmTOwjcGIJl7nk1VjKvl" + 
    "3D8Wgp6qejv4MfZ7Htdc99SUKcKWAeHYsjPXosSk3GlwKiS/sZi51Yca394GE7T4hZu6H" + 
    "TaXeZoD8+IZ7AijYn89H7EPjuu0iCAa/cjVzBsFHGszQYG+U5KfIw== [email protected]") 
print(key.bits) # 2048 
print(key.hash()) # '49:d3:cb:f6:00:d2:93:43:a6:27:07:ca:12:fd:5d:98' 
+1

Lo que es interesante es que' sshpubkeys' en realidad se refiere a la otra respuesta sobre esta pregunta para su implementación: https://github.com/ojarva/python-sshpubkeys/blob/ master/sshpubkeys/keys.py # L126 – andreyrd

Cuestiones relacionadas