Ed25519는 다음 명령을 사용하여 특정 수의 KDF 라운드로 SSH 키를 생성할 수 있습니다.
ssh-keygen -t ed25519 -a 21
(기본값은 16)
파일 합계가 주어지면 id_ed25519
이 id_ed25519.pub
라운드 번호를 찾는 방법은 무엇입니까?
답변1
개인 사유지이니 참고해주세요키 파일, 개인 키가 아닙니다. 암호 문구에서 키 암호화 키를 파생하는 데 사용됩니다(예:비밀번호 기반 키 도출 기능). 비밀번호를 변경할 때 라운드 수를 변경할 수 있습니다 ssh-keygen -p
.
이 속성을 찾을 방법이 없는 것 같습니다 ssh-keygen
. ssh-keygen -l -v
키의 속성과 일부 관련 메타데이터만 표시되며 키 암호화 방법은 표시되지 않습니다.
개인 키 파일 형식은 부분적으로 다음 문서에 설명되어 있습니다.PROTOCOL.key
. 내 대답은 이것, 소스 코드 읽기 및 실험적 관찰을 기반으로 합니다.
OpenSSH 개인 키의 기본 형식 -----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
)이 나옵니다. 그 뒤에는 24바이트로 구성된 PBKDF 옵션이 포함된 복합 문자열이 있습니다 00 00 00 18
.
- 소금길이(
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.data.rounds'
Key passphrase:
21