Какое регулярное выражение я могу использовать (если таковые имеются) для проверки этого, данная строка является легальным ssh открытым ключом RSA?
Я только должен проверить фактический ключ - я не забочусь о типе ключа о предшествовании ему или комментарии имени пользователя после него.
Идеально, кто-то также предоставит код Python для выполнения regex проверки.
Спасибо.
«Достаточно хорошая» проверка - это увидеть, начинается ли ключ с правильного заголовка.
Часть данных ключевого файла должна декодироваться из 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, но они встречаются гораздо реже.
На основании ссылок на «тип ключа, предшествующий ему» и «комментарий имени пользователя после него», я предполагаю, что вы говорите об открытых ключах, хранящихся в ssh2 формат ключевого файла.
В этом формате ключ хранится в формате base64 , поэтому простая проверка будет состоять в том, чтобы убедиться, что строка содержит только допустимые символы base64.
Если вы хотите пойти немного дальше, вы можете заметить, что первые несколько байтов закодированного ключа определяют тип ключа и совпадают с ним. См. этот пост , в котором говорится:
Если вы декодируете base64 первый бит этого текста (AAAAB3NzaC1yc2EA), вы обнаружите, что он начинается с байтов 00 00 00 07 (указывает, что следует строка из 7 символов ), а затем семь символов "ssh-rsa", которые являются типом ключа . Ключи DSA начинаются с немного другой строки `AAAAB3NzaC1kc3MA ', которая декодирует аналогично строке" ssh-dss ".