Ssh
如何檢查 Ed25519 SSH 密鑰的 KDF 輪數?
Ed25519 可以使用以下命令生成特定數量的 KDF 輪數的 SSH 密鑰:
ssh-keygen -t ed25519 -a 21
(預設為 16)給定文件
id_ed25519
和id_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 字節大端數。uint32
或int
:一個 4 字節的數字,大端編碼。二進制數據包含以下欄位:
- 空字節 ( )
openssh-key-v1␀
所在的文字字元串␀``byte[]
- 密碼名稱(例如
aes256-ctr
)(string
)- PBKDF 名稱(從 OpenSSH 8.1 開始:
bcrypt
或none
)(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