如何从字符串中获取SSH公钥的MD5指纹(签名)

时间:2019-10-06 16:34:23

标签: ruby bash ssh md5 ssh-keygen

如果我拥有该密钥的字符串而不是文件,是否可以获取公共密钥的MD5指纹(签名)?

ssh-keygen -l -E md5 -f "path/to/file"

此命令将为我(除其他外)提供密钥的MD5指纹(签名)。我已经阅读了ssh-keygen命令的手册页,并在我的shell中进行了尝试,但是我无法使它在字符串而不是文件上运行。我找不到能接受字符串的参数,我尝试了在字符串中进行管道传递,还尝试使用STDIN将字符串提供给ssh-keygen-全部没有成功。

我曾尝试在字符串上使用Ruby和Digest :: MD5.hexdigest,但是要么我没有提供正确的字符串,要么我需要使用其他哈希机制,因为我也没有运气。 (我尝试过密钥的各种子字符串)

我当然可以将字符串写入临时文件,然后在该文件上使用ssh-keygen,但似乎我不必这样做。

我最终想在Ruby中解决此问题,但是我可以从unix实用程序或bash解决方案开始。如果需要,我总是可以从Ruby执行shell命令。

如果有关系,我将在macOS Mojave(10.14.6)和Ruby 2.6.4上运行bash(GNU bash,版本3.2.57(1))shell。

编辑:我将术语从签名更改为指纹,但在括号中保留了签名。我已经看过这两个术语,但是我相信指纹更为常见。

3 个答案:

答案 0 :(得分:2)

我决定搜索解决该问题的Ruby Gem。我发现了这个:https://github.com/bensie/sshkey。仔细研究源代码,我发现我需要对字符串的密钥部分进行Base64解码,然后对它进行Digest :: MD5.hexdigest来获取密钥的指纹。

string = "ssh-rsa aabbccddqq== comment goes here" # not a real key
key = string.split(" ")[1]
fingerprint = Digest::MD5.hexdigest(Base64.decode64(key))

我在原始问题中使用了“签名”一词,我已经对该问题进行了编辑,以添加“指纹”作为替代术语

答案 1 :(得分:1)

使用-作为文件名来读取stdin作为文件。 然后用Bash的stdin

<<<"herestring"

使用Bash:

#!/usr/bin/env bash

# Fill a keystring variable for demo purpose
IFS= read -r -d '' keystring <"$HOME/.ssh/id_rsa.pub"


# Get ssh-keygen to read from the keystring rather than a file
key_md5="$(ssh-keygen -l -E md5 -f - <<<"$keystring" | cut -d ' ' -f2)" 

# Isolate and reformat the md5
# Remove the MD5: prefix
key_md5="${key_md5##MD5:}"

# Remove the in-between :
key_md5="${key_md5//:}"

# Print the md5 for testing
echo "$key_md5"

或者使用POSIX shell:

#!/usr/bin/env sh

# Fill a keystring variable for demo purpose
IFS= read -r keystring <"$HOME/.ssh/id_rsa.pub"

# Get ssh-keygen to read from the keystring rather than a file
# and reformat the md5 sum with sed POSIX Extended Regex
# sed commands:
# s/://g deletes all colon characters
# s/^[[:digit:]]\+[[:space:]]\+MD5\([[:xdigit:]]\{32\}\).*/\1/
# starting with digits followed by spaces, followed by MD5
# capture the group of 32 hexadecimal digits from the md5 sum
key_md5="$(
  echo "$keystring" \
    | ssh-keygen -l -E md5 -f - \
    | sed 's/://g;s/^[[:digit:]]\+[[:space:]]\+MD5\([[:xdigit:]]\{32\}\).*/\1/'
)"

# Print the md5 for testing
echo "$key_md5"

或者,您可以使用base64命令对密钥进行解码,并使用md5sum命令来计算shell中的总和,如下所示:

#!/usr/bin/env sh

# Fill a keystring variable for demo purpose
IFS= read -r keystring <"$HOME/.ssh/id_rsa.pub"

# Inject this sub-shell commands result into the arguments
set -- "$(

  # Pipe in the ssh key string
  echo "$keystring" |

  # Get the second field containing the base64 encoded key
  cut -d ' ' -f2 |

  # Decode the key from its base64
  base64 -d |

  # Compute the md5 sum of the key
  md5sum |

  # Get the first field containing the md5
  cut -d ' ' -f1
)"

# The key's md5 has been returned in the first argument
key_md5="$1"

# Print the md5 for testing
echo "$key_md5"

答案 2 :(得分:0)

使用 Python:

login

如果您需要冒号分隔的指纹,请尝试:

join()