Ssh

如何檢查 Ed25519 SSH 密鑰的 KDF 輪數?

  • January 10, 2022

Ed25519 可以使用以下命令生成特定數量的 KDF 輪數的 SSH 密鑰:

ssh-keygen -t ed25519 -a 21(預設為 16)

給定文件id_ed25519id_ed25519.pub,如何找到這個輪數?

請注意,這是私鑰文件的屬性,而不是私鑰的屬性。它用於從密碼片語派生密鑰加密密鑰(作為基於密碼的密鑰派生函式的參數)。使用 更改密碼時,您可以更改輪數ssh-keygen -p

似乎沒有辦法用ssh-keygen. ssh-keygen -l -v只顯示密鑰的屬性和一些相關的元數據,不包括密鑰是如何加密的。

私鑰文件格式部分記錄在PROTOCOL.key. 我的回答是基於此,基於源閱讀和實驗觀察。

私鑰的 OpenSSH 本機格式包含在兩行之間包裹的 Base64 編碼數據-----BEGIN OPENSSH PRIVATE KEY----------END OPENSSH PRIVATE KEY-----. PROTOCOL.key描述 Base64 編碼的二進制數據的內容。二進制數據是以下類型的欄位序列:

  • byte[]: 一串字節,其長度是預先知道的。
  • string: 一串字節,其長度在字元串之前編碼為 4 字節大端數。
  • uint32int:一個 4 字節的數字,大端編碼。

二進制數據包含以下欄位:

  • 空字節 ( )openssh-key-v1␀所在的文字字元串␀``byte[]
  • 密碼名稱(例如aes256-ctr)(string
  • PBKDF 名稱(從 OpenSSH 8.1 開始:bcryptnone)(string
  • PBKDF 選項 ( string)
  • (我們不關心其餘的)

PBKDF 選項本身被結構化為一系列欄位。對於bcrypt,它們是:

  • 鹽 ( string)
  • 輪數 ( uint32)

以下是如何直覺地檢查私鑰文件以查找 KDF 資訊。

$ <id_ed25519 grep -v '^-' | base64 -d | xxd -g1
00000000: 6f 70 65 6e 73 73 68 2d 6b 65 79 2d 76 31 00 00  openssh-key-v1..
00000010: 00 00 0a 61 65 73 32 35 36 2d 63 74 72 00 00 00  ...aes256-ctr...
00000020: 06 62 63 72 79 70 74 00 00 00 18 00 00 00 10 fe  .bcrypt.........
00000030: 57 c1 fe c6 47 cf 63 34 ef 83 35 61 aa f6 31 00  W...G.c4..5a..1.
00000040: 00 00 15 00 00 00 01 00 00 00 33 00 00 00 0b 73  ..........3....s
00000050: 73 68 2d 65 64 32 35 35 31 39 00 00 00 20 7b c8  sh-ed25519... {.
…

從一開始,遵循三個人類可讀的字元串 ( openssh-key-v1, aes256-ctr, bcrypt。之後,有一個帶有 PBKDF 選項的複合字元串,由 24 個00 00 00 18字節組成。這 24 個字節包括:

  • 鹽長度 ( 00 00 00 10)。
  • 鹽(鹽長度表示的 16 個字節)。
  • 輪數 ( 00 00 00 15) — 即 0x15 = 21。

如果您想以程式方式提取此內容,而不是編寫自己的腳本,可以使用 Python 庫:openssh-key-parser.

$ pip install -U openssh-key-parser
…
$ python3 -m openssh_key id_ed25519 | jq '.header.kdf'
Key passphrase: 
"bcrypt"
$ python3 -m openssh_key id_ed25519 | jq '.kdf_options.rounds'
Key passphrase: 
21

引用自:https://unix.stackexchange.com/questions/685809