2010-03-22 7 views
9

Welcher reguläre Ausdruck kann ich (falls vorhanden) verwenden, um zu validieren, dass eine gegebene Zeichenfolge ein zulässiger ssh rsa öffentlicher Schlüssel ist?ssh-rsa Validierung des öffentlichen Schlüssels mit einem regulären Ausdruck

Ich brauche nur den tatsächlichen Schlüssel zu validieren - ich interessiere mich nicht für den Schlüsseltyp, den es vorausgeht oder den Benutzernamen Kommentar danach.

Idealerweise wird auch jemand den Python-Code bereitstellen, um die Regex-Validierung auszuführen.

Danke.

+0

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

+1

Warum glauben Sie, dass Sie das tun müssen? – Callahad

+1

@Callahad - Ich möchte sicherstellen, dass es ein gültiger Schlüssel ist, bevor mein automatisches System die Datei authorized_keys eingibt. – Warlax

Antwort

11

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.

+0

Wenn ich Ihren Code richtig verstehe, überprüfen Sie, dass "key_string" eine base64 decodierbare Sequenz ist und stellen Sie dann sicher, dass es mit 7 beginnt, weil alle rsa pubkeys mit 7 beginnen? Was bedeutet 'Daten [4:11] == Typ" bedeuten? – Warlax

1

Basierend auf den Verweisen auf "Schlüsseltyp, der ihm vorausgeht" und "Benutzername Kommentar danach" nehme ich an, dass Sie über öffentliche Schlüssel sprechen, die im ssh2-Schlüsseldateiformat gespeichert sind.

In diesem Format wird der Schlüssel im Format base64 gespeichert. Es sollte also überprüft werden, ob die Zeichenfolge nur gültige base64-Zeichen enthält.

Wenn Sie ein wenig weiter gehen möchten, könnten Sie feststellen, dass die ersten paar Bytes des codierten Schlüssels den Schlüsseltyp angeben und darauf abgestimmt sind. Siehe this post, die sagt:

Wenn Sie base64-dekodiert das erste Bit dass Text (AAAAB3NzaC1yc2EA) Sie feststellen, dass es mit Bytes beginnt 00 00 00 07 (was anzeigt, dass ein 7-Zeichen String folgt) und dann die sieben Zeichen "ssh-rsa", die der Schlüssel Typ ist. DSA-Schlüssel beginnen mit der etwas anderen Zeichenfolge `AAAAB3NzaC1kc3MA ', die ähnlich der Zeichenfolge" ssh-dss "dekodiert.

+0

Das Layout "type key comment" ist das openssh-Format. Das SSH2-Format ist in rfc4716 beschrieben. – JimB

Verwandte Themen