web-dev-qa-db-ja.com

SSH公開鍵のフィンガープリントはどのように計算されますか?

次の64バイトのエンコードされた文字列として公開鍵を持っています

AAAAB3NzaC1yc2EAAAADAQABAAABAQDapfZSmaVBZimVC7YAsISc+fKzuhbVmmbJNYELWov4ZVbdbFxf790xC0sKQTmbe1iDt25DdsandggApKZh6yvWD0Li5RV+h5wV6chTNwOUe6A7Q4Y4nbMozxTzT0vpMOzZv8+RffzbSnS9GVin/4BACnih10tYzwgCe6y3ei3E5hytSGMkviYIcRQ5x4W2KgSa+BXRSGnpYU69u/b/uF7KDaIhcMqenZBy5YKt4nBYnbKFAgUk/yZRrPq9knVqXO+cQ3ZZlF1KNnrx+o3oR9OqtgjqFyXMyFIiT4oqtXXiVNmoc5C+kg7pDxR4Fcr15xTJpZl8kc8qt+WS5QpLgJjT

pythonでsha256ダイジェストを実行し、次のように結果をbase64で出力する場合:

sha256 = hashlib.sha256()
sha256.update(plaintext.encode())
hash_sha256 = sha256.digest()
print(base64.b64encode(hash_sha256))

指紋を取得したときとは違う指紋を取得した

ssh-keygen -lf key.pub

Sha256フィンガープリントは公開鍵のsha256にすぎないと思っていました... key.pubファイルの内容も正確に追加してみました。

ssh-rsa ... user@Host

しかし、私はまた別の結果を得ます

では、フィンガープリントはどのように正確に計算されますか?同じことがMD5にも当てはまりますか?

3
Guerlando

残念ながら、完全なコードは表示されませんでした。つまり、コード内のplaintextがどこから来ているのか明確にされていません。私の推測では、base64でエンコードされた公開鍵を最初にデコードするのではなく、エンコードされたキーを直接ダイジェストに送りました。次は私のために働きます:

b64pubkey='AAAAB3Nz....'  # base64 encoded public key
sha256 = hashlib.sha256()
sha256.update(base64.b64decode(b64pubkey))
hash_sha256 = sha256.digest()
print(base64.b64encode(hash_sha256))
5
Steffen Ullrich

私はあなたにそれを思い出させたいと思います:

ssh-keygenによって計算されたbase64フィンガープリントは次のようになります。

慣例によるSSHは、末尾のパディング(パディング=s)を省略します

ここで私の質問を参照してください https://stackoverflow.com/questions/56769749/calculate-ssh-public-key-fingerprint-into-base64-why-do-i-have-an-extra

0
Rick