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.

Foi útil?

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 ".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top