Aqui https://security.stackexchange.com/a/52564 você pode ler que as versões mais recentes do OpenSSH usam bcrypt para proteger o arquivo de chave. A segurança do bcrypt depende do fator de custo, consulte https://security.stackexchange.com/questions/139721/estimate-the-time-to-crack-passwords-using-bcrypt/201965#201965
De acordo com https://crypto.stackexchange.com/questions/58536/how-does-openssh-use-bcrypt-to-set-ivs/58543#58543 o número padrão da rodada bcrypt seria 16. Esta seria uma boa segurança . Mas como obter a contagem de rodadas/fator de custo?
O que eu fiz até agora: Parece que a chave (para torná-la mais curta aqui, apenas uma chave fraca de 1024 bits)
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABBLF8sO2Q
hcLXI43z96e1hiAAAAEAAAAAEAAACXAAAAB3NzaC1yc2EAAAADAQABAAAAgQC0gBWeZpej
9ILT/59bEb0/lSvXx0WfZqP2lXRDbuY+gluuWyT+REQcVTR2BxSx9F/P20mLTnupzY+XE3
xEu+SIJlwKIAH3fed62+QBzDrPsl9kyfoIGIvi/28ZftqVN/kg0GSOaAqu4Px+vNVX1VKn
PNV5VVCZWL4ZPlGQZ48UJwAAAhCwDkueKT9oq8E0qtD92/4DSAD2eTI7bd6jBGUxugEw85
6xWbRYnFQZdwO2ZCNV0aTHViD1FRKlC9cBHDoSORKcM/9dY9Msy6lZj7Tp5s8r7x2pOrJi
TVRbv5/cI732I+l/vYvssJEhZpeSw4JKh9tyPpifVmzBxqtqwkBrTuLCMqkwLmrcxReFUq
aA/RIZy3L616CJsAvx2ezEc49D6SbJ9i9OlKuv73a1baS4RpMvFzWGLE2NBvvtQpEnJFoL
Kyjz+two4doT6SZ7UtiVGyCtO5WQEoeAgjhkbZzOPtM2AvoV+hNLRIX2/52jOB5A1bNQ0v
qW64aj2YNe8vWfj5xtA/8BlyEG7gwhu+0HgbgMDxw7o/0qVkHM/Hv3YgBTRygsH+8h4wsR
kxA292NOKKaD18tv1j3atR80q0XQVcQH20uX8tSqXtKfDtkUc/EPbFCNp3xQJG/F81USKh
YAmjxEeDkZZ/LkEOEJKvFRCL3gFlH4rqF5/pRk6HmB99xceD4irbazm+BWfPAf5Q0zdB5L
/yei3sqA4G48yRXIkaELtYNEeTYHMp3PGz1b3CP3l+ZGZp6XNaM+sMfdICbI3Zae5bnxKg
VXEE2UMdi7DEXbqEzSlfcIf5QzXHMQJm0ZL+iLoaEmakamAxCKk6jJ+QzHzGADZEIRXrj3
5Nhhd0jsToEMsXmmawt2qxy0cIHET1M=
-----END OPENSSH PRIVATE KEY-----
PW étest
Então vamos decodificar a base64. Portanto, a primeira e a última linha começando com '-----' devem ser removidas
cat key | tail -n +2 | head -n -1 | base64 -d > text.txt
Agora abra text.txt por exemplo no Notepad++ Isso mostra
mas agora não tenho ideia de como ler a contagem de rodadas a partir daí. Você pode ajudar?
Pegue sua base64, decodifique-a em hexadecimal:
A especificação define o formato desses dados. Podemos então separar os dados:
Sequência de opções do KDF
A parte que você quer é a string kdfOptions :
O que a especificação explica:
Em outras palavras:
Duvido que eles signifiquem "rodadas" . Eu suponho que eles significavam CostFactor .
Mas aí está.
Bcrypt não é um KDF
BCrypt não é uma função de derivação de chave; é uma função de armazenamento de senha. Você não pode usar bcrypt para gerar uma "chave" . Por exemplo, se você quiser "derivar" uma chave AES de 256 bits: bcrypt não pode fazer isso.
Isso porque bcrypt não é uma função de derivação de chave.
BCrypt é uma função de hash de senha.
O uso indevido do bcrypt dessa maneira é uma abominação - e um crime contra a humanidade.
Mais sobre bcrypt ser uma função de hash de senha e não uma função de derivação de chave pode ser encontrada aqui https://crypto.stackexchange.com/a/70783
Algumas informações adicionais. Recapitular a proteção por senha de novas chaves ssh é bastante seguro.
Ao criar a chave ou alterar a senha, você pode usar
-a <number of rounds>
.Isso foi feito em um antigo i3-3220 e precisa de cerca de metade do tempo no Ryzen 7 5700U. Então rodadas são de fato rodadas e não um fator de custo.
Para saber se sua chave está no novo formato, use
cat key | tail -n +2 | head -n -1 | base64 -d | head -n 2
Se você viraes256-ctrbcrypt
, então sua chave está no novo formato.Para obter uma estimativa de quão seguro é contra a adivinhação de senha de força bruta, usei John, o estripador. Atualmente, o Hashcat (março de 2022) não oferece suporte para esse formato, consulte https://hashcat.net/forum/thread-10662.html Binários pré-construídos para John, o estripador, também podem não incluir o módulo necessário para quebrar esse novo tipo de chave ssh formato.
Depois de compilar John, o estripador, vá para o
run
diretório e crie o hash do seu arquivo de chave SSH viapython3 ssh2john.py <keyfile> > hash.txt
Agora inicie John the Ripper via
./john hash.txt
. O programa usará uma lista de senhas enviadas. No AMD Ryzen 7 5700U, ele pode tentar cerca de 132 PW/s (c/s), o que é um número muito baixo. Este é apenas CPU. Ao mudar as rodadas para 32 via-a 32
número é metade (65 PW/s) como esperado.Para obter uma estimativa do que seria possível com a GPU, também usei um hash de criptografia MD5 e, com isso, John the Ripper conseguiu tentar cerca de 712.000 senhas por segundo, cerca de 5400 vezes mais rápido.
Quando você compara isso com o GTX1080, que é capaz de cerca de 10 milhões de senhas por segundo com MD5Crypt https://gist.github.com/epixoip/a83d38f412b4737e99bbef804a270c40 Então, se isso for linear, o GTX 1080 é cerca de 14 vezes mais rápido que o Ryzen 7 5700U, portanto, apenas cerca de 1850 PW/s deve ser possível.
Portanto, a criptografia sshkey atual é bastante segura contra ataques offline.
Para o final, um pequeno script python que recebe
filename="test.key"
sua chave ssh e, se for o formato bcrypt, mostra o fator sal e custo.