2010-03-22 25 views
9

¿Qué expresión regular puedo usar (si existe) para validar que una cadena dada es una clave pública ssh rsa legal?ssh-rsa validación de clave pública utilizando una expresión regular

Solo necesito validar la clave real - No me importa el tipo de clave que la precede o el nombre de usuario que comenta después de ella.

Idealmente, alguien también proporcionará el código python para ejecutar la validación de expresiones regulares.

Gracias.

+0

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

+1

¿Por qué crees que necesitas hacer esto? – Callahad

+1

@ Callahad - Quiero asegurarme de que sea una clave válida antes de que mi sistema automático ingrese el archivo authorized_keys. – Warlax

Respuesta

11

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.

+0

. Si entiendo tu código correctamente, estás comprobando que 'key_string' es una secuencia decodificable base64 y luego asegúrate de que comience con 7 porque todas las pubys rsa comienzan con 7? ¿Qué significa 'data [4:11] == type'? – Warlax

1

Según las referencias al "tipo de clave que lo precede" y "el comentario del nombre de usuario después de él", supongo que está hablando de claves públicas almacenadas en formato ssh2 keyfile.

En ese formato, la clave se almacena en el formato base64, por lo que una verificación simple sería verificar que la cadena contenga solo caracteres base64 válidos.

Si quiere ir un poco más allá, puede observar que los primeros bytes de la clave codificada especifican el tipo de clave y coinciden en eso. Ver this post, que dice:

Si usted base64 decodificar el primer bit de ese texto (AAAAB3NzaC1yc2EA) podrás encontrar que comienza con bytes 00 00 00 07 (lo que indica que un 7 caracteres sigue la cadena) y luego los siete caracteres "ssh-rsa", que es el tipo de clave . Las claves DSA comienzan con la cadena ligeramente diferente `AAAAB3NzaC1kc3MA ', que decodifica de forma similar a la cadena" ssh-dss ".

+0

el diseño de "tipo de comentario clave" es el formato openssh. El formato SSH2 se describe en rfc4716 – JimB

Cuestiones relacionadas