Como descriptografar nomes de host de um .ssh / known_hosts criptografados com uma lista dos nomes de host?

14

Eu tento encontrar um script para descriptografar (unhash) os nomes de host ssh no arquivo known_hosts , passando uma lista dos nomes de host .

Então, para fazer exatamente o inverso de :

ssh-keygen -H -f known_hosts

Ou também, fazer o mesmo que isso, se o ssh config HashKnownHosts estiver definido como No:

ssh-keygen -R know-host.com -f known_hosts
ssh-keyscan -H know-host.com >> known_hosts

Mas sem baixar novamente a chave do host (causada pelo ssh-keyscan).

Algo como:

ssh-keygen --decrypt -f known_hosts --hostnames hostnames.txt

Onde hostnames.txt contém uma lista de nomes de host.

Xorax
fonte
Os nomes de host fazem parte das entradas em known_hosts. O que é descriptografar?
Muni
1
Quero dizer para um arquivo conhecido_hosts criptografado. Onde a configuração ssh HashKnownHosts é Sim. Eu modifiquei o título.
Xorax

Respostas:

22

As linhas no known_hostsarquivo não são criptografadas, elas são hash. Você não pode descriptografá-los, porque eles não são criptografados. Você não pode "unhash" eles, porque é disso que se trata um hash - dado o hash, é impossível¹ descobrir a string original. A única maneira de "unhash" é adivinhar a string original e verificar seu palpite.

Se você tiver uma lista de nomes de host, poderá passá-los ssh-keygen -Fe substituí-los pelo nome do host.

while read host comment; do
  found=$(ssh-keygen -F "$host" | grep -v '^#' | sed "s/^[^ ]*/$host/")
  if [ -n "$found" ]; then
    ssh-keygen -R "$host"
    echo "$found" >>~/.ssh/known_hosts
  fi
done <hostnames.txt

¹ No sentido prático, isto é, levaria todos os computadores existentes hoje mais do que a era atual do universo para fazê-lo.

Gilles 'SO- parar de ser mau'
fonte
13

A página do manual ssh-keygen (1) diz a -F hostnameopção:

Procure o nome do host especificado em um arquivo known_hosts, listando quaisquer ocorrências encontradas. Essa opção é útil para encontrar nomes ou endereços de host com hash e também pode ser usada em conjunto com a -Hopção de imprimir chaves encontradas em um formato de hash.

Parece ser o que você quer.

vinc17
fonte
Isso retorna a linha com o nome do host com hash. Quero unhash para substituí-lo no arquivo known_hosts. Ele precisa de um script para analisar cada linha, descompactá-lo e substituí-lo no arquivo known_hosts.
Xorax
2
@Xorax Sim, mas com este comando, você pode recuperar o nome do host com hash e substituí-lo no known_hostsarquivo por sed.
precisa