Una verificación "lo suficientemente buena" es para ver si la clave comienza con el encabezado correcto.
La parte de datos del archivo de claves debe decodificar de base64, o se producirá un error con un base64.binascii.Error
desempaquetar los primeros 4 bytes (un int), que debe ser 7. Esta es la longitud de la siguiente cadena (supongo que esto podría ser diferente, pero solo te preocupas por 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
Como alternativa, puede renunciar a los controles binarios, y buscar AAAAB3NzaC1yc2EA
en el inicio de una clave ssh-rsa, poco todavía verificaría base 64 es válido.
[editar] Aclaración:
A través de la especificación, la primera parte si la clave es una cadena con prefijo de longitud. La longitud está empaquetada como una int sin signo de big-endian ('> I' para una estructura de python). Es un 7 aquí, porque la siguiente cadena, 'ssh-rsa', tiene 7 bytes de longitud. data[4:11]
son los siguientes 7 bytes (por el prefijo de longitud), pero he editado el código anterior para usar algunas variables descriptivas para tratar de aclarar esto. Si quieres ser minucioso, también debes verificar ssh-dss, y posiblemente pgp-sign-rsa, y pgp-sign-dss, pero son mucho menos comunes.
Como lo señaló David, comprobar que la cadena contenía solo caracteres válidos de Base64 es un comienzo, pero incluso esto no garantiza que sea una clave SSH válida. Dado que la clave es esencialmente datos binarios (en formato Base64), no creo que una expresión regular sea la herramienta adecuada para la validación de claves en absoluto. – Peter
¿Por qué crees que necesitas hacer esto? – Callahad
@ Callahad - Quiero asegurarme de que sea una clave válida antes de que mi sistema automático ingrese el archivo authorized_keys. – Warlax