Ein "gut genug" Check ist zu sehen, ob der Schlüssel mit dem richtigen Header beginnt.
Der Datenteil der Schlüsseldatei aus Base64 dekodieren sollte, oder es wird das erste 4 Bytes (ein int) mit einem base64.binascii.Error
auspacken versagen, die 7. sein soll Dies ist die Länge der folgenden Zeichenfolge (ich denke, das könnte anders sein, aber Sie sind nur mit SSH-RSA betroffen).
openssh_pubkey = open('keyfile').read()
type, key_string, comment = openssh_pubkey.split()
data = base64.decodestring(key_string)
int_len = 4
str_len = struct.unpack('>I', data[:int_len])[0] # this should return 7
data[int_len:int_len+str_len] == type
Alternativ können Sie die binären Kontrollen verzichten, und suchen Sie nach AAAAB3NzaC1yc2EA
zu Beginn eines ssh-rsa Schlüssel, Bit Ich würde überprüfen, noch es gültig base64 ist.
[Bearbeiten] Erläuterung:
Über die Spezifikation, der erste Teil, wenn der Schlüssel eine Länge Präfix Zeichenfolge ist. Die Länge ist als Big-Endian unsigned int ('> I' für eine Python-Struktur) gepackt. Es ist eine 7 hier, weil die folgende Zeichenfolge, 'ssh-rsa', 7 Bytes lang ist. data[4:11]
ist die nächsten 7 Bytes (pro Längen-Präfix), aber ich habe den obigen Code bearbeitet, um einige beschreibende Variablen zu verwenden, um dies zu verdeutlichen. Wenn Sie gründlich sein wollen, sollten Sie auch nach ssh-dss und möglicherweise nach pgp-sign-rsa und pgp-sign-dss suchen, aber sie sind weit weniger verbreitet.
Wie von David darauf hingewiesen, dass die Zeichenfolge nur gültige Base64-Zeichen enthält, ist ein Start, aber auch dies stellt nicht sicher, dass es sich um einen gültigen SSH-Schlüssel handelt. Da der Schlüssel im Wesentlichen binäre Daten (im Base64-Format) ist, halte ich eine Regex nicht für das richtige Werkzeug zur Validierung von Schlüsseln. – Peter
Warum glauben Sie, dass Sie das tun müssen? – Callahad
@Callahad - Ich möchte sicherstellen, dass es ein gültiger Schlüssel ist, bevor mein automatisches System die Datei authorized_keys eingibt. – Warlax