如何使用主机名列表解密加密的 .ssh/known_hosts 的主机名?

Xor*_*rax 21 ssh encryption hostname ssh-keygen

我尝试通过传递 hostnamses 列表来找到一个脚本来解密(unhash) known_hosts 文件中的 ssh 主机名。

所以,完全相反

ssh-keygen -H -f known_hosts
Run Code Online (Sandbox Code Playgroud)

或者,如果 ssh 配置 HashKnownHosts 设置为 No,则执行与此相同的操作:

ssh-keygen -R know-host.com -f known_hosts
ssh-keyscan -H know-host.com >> known_hosts
Run Code Online (Sandbox Code Playgroud)

但无需重新下载主机密钥(由 ssh-keyscan 引起)。

就像是:

ssh-keygen --decrypt -f known_hosts --hostnames hostnames.txt
Run Code Online (Sandbox Code Playgroud)

其中 hostnames.txt 包含主机名列表。

Gil*_*il' 31

在该行known_hosts的文件是不加密的,他们被散列。你不能解密它们,因为它们没有加密。您不能“取消散列”它们,因为这就是散列的全部内容——给定散列,就不可能¹发现原始字符串。“unhash”的唯一方法是猜测原始字符串并验证您的猜测。

如果您有主机名列表,则可以将它们传递给ssh-keygen -F主机名并用主机名替换它们。

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
Run Code Online (Sandbox Code Playgroud)

¹在实际意义上,即今天存在的所有计算机都需要比当前宇宙年龄更长的时间才能做到这一点。

  • @EdwardNedHarvey 根据定义,加密是可逆的。 (2认同)

vin*_*c17 16

ssh-keygen(1) 手册页说明了该-F hostname选项:

在 known_hosts 文件中搜索指定的主机名,列出找到的所有事件。此选项对于查找散列的主机名或地址很有用,也可以与-H以散列格式打印找到的键的选项结合使用。

这似乎是你想要的。

  • @Xorax 是的,但是使用此命令,您可以检索散列的主机名,并将其在“known_hosts”文件中替换为“sed”。 (2认同)