проверка ssh-открытого-ключа-RSA с помощью регулярного выражения

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

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

Идеально, кто-то также предоставит код Python для выполнения regex проверки.

Спасибо.

9
задан Warlax 22 March 2010 в 17:41
поделиться

2 ответа

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

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

Распакуйте первые 4 байта (целое число), которые должны быть 7. Это {{1} } длина следующей строки (я думаю, она может быть другой, но вас интересует только 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.

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

11
ответ дан 4 December 2019 в 15:14
поделиться

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

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

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

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

2
ответ дан 4 December 2019 в 15:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: