Ed25519 SSH 키의 KDF 라운드 번호를 확인하는 방법은 무엇입니까?

Ed25519 SSH 키의 KDF 라운드 번호를 확인하는 방법은 무엇입니까?

Ed25519는 다음 명령을 사용하여 특정 수의 KDF 라운드로 SSH 키를 생성할 수 있습니다.

ssh-keygen -t ed25519 -a 21(기본값은 16)

파일 합계가 주어지면 id_ed25519id_ed25519.pub라운드 번호를 찾는 방법은 무엇입니까?

답변1

개인 사유지이니 참고해주세요키 파일, 개인 키가 아닙니다. 암호 문구에서 키 암호화 키를 파생하는 데 사용됩니다(예:비밀번호 기반 키 도출 기능). 비밀번호를 변경할 때 라운드 수를 변경할 수 있습니다 ssh-keygen -p.

이 속성을 찾을 방법이 없는 것 같습니다 ssh-keygen. ssh-keygen -l -v키의 속성과 일부 관련 메타데이터만 표시되며 키 암호화 방법은 표시되지 않습니다.

개인 키 파일 형식은 부분적으로 다음 문서에 설명되어 있습니다.PROTOCOL.key. 내 대답은 이것, 소스 코드 읽기 및 실험적 관찰을 기반으로 합니다.

OpenSSH 개인 키의 기본 형식 -----BEGIN OPENSSH PRIVATE KEY-----은 두 줄과 -----END OPENSSH PRIVATE KEY-----. PROTOCOL.keyBase64로 인코딩된 이진 데이터의 내용을 설명합니다. 이진 데이터는 다음 유형의 필드 시퀀스입니다.

  • 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

관련 정보