validação de chave pública ssh-rsa usando uma expressão regular
-
21-09-2019 - |
Pergunta
Que expressão regular posso usar (se houver) para validar que uma determinada string é uma chave pública ssh rsa legal?
Eu só preciso validar a chave real - não me importo com o tipo de chave que a precede ou com o comentário do nome de usuário depois dela.
Idealmente, alguém também fornecerá o código python para executar a validação de regex.
Obrigado.
Solução
Uma verificação "boa o suficiente" é ver se a chave começa com o cabeçalho correto.
A parte de dados do arquivo-chave deve ser decodificada de base64 ou falhará com base64.binascii.Error
Descompacte os primeiros 4 bytes (um int), que deve ser 7.Essa é a duração da string a seguir (acho que isso pode ser diferente, mas você está preocupado apenas com a 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
Alternativamente, você pode renunciar às verificações binárias e procurar AAAAB3NzaC1yc2EA
no início de uma chave ssh-rsa, mas eu ainda verificaria se é base64 válido.
[editar] Esclarecimento:
Por meio da especificação, a primeira parte se a chave for uma string com prefixo de comprimento.O comprimento é compactado como um unsigned int big-endian ('>I' para uma estrutura python).É 7 aqui, porque a string a seguir, 'ssh-rsa', tem 7 bytes de comprimento. data[4:11]
são os próximos 7 bytes (de acordo com o prefixo de comprimento), mas editei o código acima para usar algumas variáveis descritivas para tentar deixar isso mais claro.Se quiser ser minucioso, você também deve verificar ssh-dss, e possivelmente pgp-sign-rsa e pgp-sign-dss, mas eles são muito menos comuns.
Outras dicas
Com base nas referências ao "Tipo de chave que precede" e "Comentário do nome de usuário após ele", presumo que você esteja falando sobre chaves públicas armazenadas no formato SSH2 KeyFile.
Nesse formato, a chave é armazenada em base64 O formato, portanto, uma verificação simples seria verificar se a string contém apenas caracteres Base64 válidos.
Se você quiser ir um pouco mais longe, pode observar que os primeiros bytes da tecla codificada especificam o tipo de chave e correspondem a isso. Ver esta postagem, que diz:
Se você Base64-Decode o primeiro bit desse texto (aaaab3nzac1yc2ea), descobrirá que ele começa com bytes 00 00 00 07 (indicando que uma sequência de 7 caracteres segue) e depois os sete caracteres "SSH-RSA", que é o tipo de chave. As teclas DSA começam com a string ligeiramente diferente `aaaab3nzac1kc3ma ', que decodifica de maneira semelhante à string" ssh-dss ".