Как я могу получить отпечаток MD5 (подпись) открытого ключа SSH из строки - PullRequest
0 голосов
/ 06 октября 2019

Есть ли способ получить отпечаток MD5 (подпись) открытого ключа, если у меня есть строка этого ключа, а не файл?

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

Эта команда выдаст мне (среди прочего) отпечаток MD5 (подпись) ключа. Я прочитал man-страницу для команды ssh-keygen и экспериментировал с моей оболочкой, но я не смог заставить ее работать со строкой, а не над файлом. Я не могу найти аргумента, который принимает строку, и я попытался передать в строку, а также использовать STDIN для передачи строки в ssh-keygen - все безуспешно.

Я пытался использовать Ruby и Digest ::MD5.hexdigest для строки, но либо я не предоставляю правильную строку, либо мне нужно использовать какой-то другой механизм хеширования, потому что мне тоже не повезло с этим. (Я пробовал разные подстроки ключа)

Я мог бы, конечно, записать строку во временный файл и затем использовать ssh-keygen для этого файла, но, похоже, мне не следовалоto.

В конечном итоге я хотел бы решить эту проблему в Ruby, но я могу начать с утилиты Unix или решения bash. При необходимости я всегда могу выполнить команду оболочки из Ruby.

Если это имеет значение, я запускаю оболочку bash (GNU bash, версия 3.2.57 (1)) на MacOS Mojave (10.14.6) иRuby 2.6.4

Редактировать: я изменил термин с подписи на отпечаток, но оставил подпись в скобках. Я видел оба используемых термина, но я считаю, что отпечатки пальцев - более распространенное явление.

Ответы [ 2 ]

2 голосов
/ 06 октября 2019

Я решил поискать Ruby Gem, который решает проблему. Я нашел это: https://github.com/bensie/sshkey. Копаясь по исходному коду, я обнаружил, что мне нужно Base64 декодировать ключевую часть строки, а затем сделать Digest :: MD5.hexdigest, чтобы получить отпечаток пальцаkey.

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

Я использовал термин «подпись» в исходном вопросе, я отредактировал этот вопрос, чтобы добавить «отпечаток пальца» в качестве альтернативного термина

1 голос
/ 06 октября 2019

Используйте - в качестве имени файла, чтобы прочитать stdin в качестве файла. Затем введите stdin с помощью Bash's <<<"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:

#!/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 для вычисления суммы в оболочке, например:

#!/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"
...