Проверка открытого ключа ssh-rsa с помощью регулярного выражения - PullRequest
9 голосов
/ 22 марта 2010

Какое регулярное выражение я могу использовать (если есть) для проверки того, что данная строка является допустимым открытым ключом ssh rsa?

Мне нужно только проверить фактический ключ - меня не волнует тип ключа перед ним или комментарий имени пользователя после него.

В идеале, кто-то также предоставит код Python для запуска проверки регулярных выражений.

Спасибо.

Ответы [ 2 ]

11 голосов
/ 22 марта 2010

«Достаточно хорошая» проверка - проверить, начинается ли ключ с правильного заголовка.

Часть данных ключевого файла должна декодироваться из base64, иначе произойдет сбой с base64.binascii.Error

Распакуйте первые 4 байта (целое число), которое должно быть 7. Это длина следующей строки (я думаю, это может быть по-другому, но вас интересует только ssh-rsa).

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

В качестве альтернативы, вы можете отказаться от бинарных проверок и искать AAAAB3NzaC1yc2EA в начале ключа ssh-rsa, бит, который я все равно проверил бы, что он действительный base64.

[редактировать] Разъяснение:
Посредством спецификации, первая часть, если ключ представляет собой строку с префиксом длины. Длина упаковывается как беззнаковое целое с прямым порядком байтов ('> I' для структуры python). Здесь 7, потому что следующая строка ssh-rsa имеет длину 7 байт. data[4:11] - это следующие 7 байтов (для префикса длины), но я отредактировал приведенный выше код, чтобы использовать некоторые описательные переменные, чтобы сделать это более понятным. Если вы хотите быть внимательным, вам также следует проверить ssh-dss и, возможно, pgp-sign-rsa и pgp-sign-dss, но они встречаются гораздо реже.

2 голосов
/ 22 марта 2010

Исходя из ссылок на "тип ключа, который предшествует ему" и "комментарий имени пользователя после него", я предполагаю, что вы говорите об открытых ключах, хранящихся в формате файла ключей ssh2.

В этом формате ключ хранится в формате base64 , поэтому простой проверкой будет проверка того, что строка содержит только допустимые символы base64.

Если вы хотите пойти немного дальше, вы можете заметить, что первые несколько байтов закодированного ключа указывают тип ключа и совпадают по нему. См. этот пост , в котором говорится:

Если вы base64-декодируете первый бит этот текст (AAAAB3NzaC1yc2EA) вы будете найти, что это начинается с байтов 00 00 00 07 (указывает, что 7-символьный строка следует), а затем семь символы "SSH-RSA", который является ключом тип. DSA ключи начинаются с немного другая строка AAAAB3NzaC1kc3MA, который декодирует аналогично строке "ssh-dss".

...