2011-07-13 7 views
17

Próbuję zrozumieć kroki, aby wziąć klucz publiczny OpenSSH tak:Wyprowadzenie ssh papilarnych z kluczem publicznym w Pythonie

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

A następnie przekształcić go w standardzie fingerprint tak:

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

starałem się zanurzyć się w źródle OpenSSH to zrozumieć, ale to jest na mojej głowie. Moim pierwszym przypuszczeniem było zrobienie prostego MD5 na kluczowym tekście, ale wynik nie pasuje do powyższego wyniku.

+0

Odcisk palca nie jest bezpośrednim hash klucza. Możesz zagłębić się w źródło openssh, w szczególności dla ssh-keygen, które ma kod ekstrakcji odcisków palców. Kilka drobnych szczegółów tutaj: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html –

Odpowiedz

35

Jest to suma MD5 klucza base64 zakodowane:

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

Dzięki, to było przydatne. Zastąpiłem 'line.partition ('ssh-rsa') [2]' z 'line.split() [2]' aby obsługiwać opcjonalne adnotacje OpenSSH takie jak: 'ssh-rsa ..... key ... JohnDoe @ his_laptop', który musi zostać usunięty. –

+0

@ Adrián Masz całkowitą rację, naprawiono. Zakładam, że masz na myśli 'split() [1]'. – phihag

+0

oh, yeah '[1]' ._. " –

3

https://github.com/ojarva/sshpubkeys

pip install sshpubkeys

Zastosowanie:

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

Co ciekawe,' sshpubkeys' faktycznie odnosi się do innej odpowiedzi na to pytanie w celu jej realizacji: https://github.com/ojarva/python-sshpubkeys/blob/ master/sshpubkeys/keys.py # L126 – andreyrd

Powiązane problemy