yescrypt의 j9T는 무엇을 의미합니까(/etc/shadow에서)?

yescrypt의 j9T는 무엇을 의미합니까(/etc/shadow에서)?

이 그림자 문자열을 고려하십시오.

$y$j9T$PaFEMV0mbpeadmHDv0Lp31$G/LliR3MqgdjEBcFC1E.s/3vlRofsZ0Wn5JyZHXAol5

4개의 부품이 있습니다.

  • ID: y (yescrypt)
  • 매개변수: j9T
  • 소금: PaFEMV0mbpeadmHDv0Lp31
  • 해시: G/LliR3MqgdjEBcFC1E.s/3vlRofsZ0Wn5JyZHXAol5

묻다:

  1. j9Tparam 필드의 의미는 무엇입니까?
  2. 이 영역에 다른 옵션이 있나요?
  3. 공식 문서는 어디에서 찾을 수 있나요?

나는 이 문제를 본 적이 있습니다.암호화된 비밀번호의 형식은 다음과 같습니다./etc/shadow그러나 거기에는 설명이 없습니다.

답변1

부인 성명

다음은 암호화 및 관련 개념에 대한 전문적인 이해 없이 제가 발견한 내용과 이를 해석하는 방식입니다.

징후

다음과 같이 주목할 가치가 있습니다.yescrypt CHANGES문서OpenWall GitHub에 대한 정보0.8.1(2015/10/25)과 1.0.0(2018/03/09) 사이의 변경 사항,yescrypt사인이 2개 있어요:

  • $7$- scrypt매우 컴팩트하지 않은 클래식 해시고정 길이 인코딩
  • $y$- 네이티브 yescrypt및 클래식 scrypt해시, 새로운 해시는 매우 컴팩트합니다.가변 길이 인코딩

이것은 매우 컴팩트하다가변 길이 인코딩두 번째 단락의 끝에서 복잡성의 전부는 아니지만 대부분을 소개하는 것은 무엇입니까?이 UNIX StackExchange 답변말하다.

매개변수

매개변수에 대한 간략한 설명을 보려면BitcoinWiki Yescrypt 매개변수일부는 도움이 될 수 있습니다:

범위 설명하다
password 비밀번호 해시
salt 소금을 사용하다
flags 토글 기능 플래그
N N을 늘리면 런타임 및 메모리 사용량이 늘어납니다.
r R을 늘리면 알고리즘이 작동하는 블록의 크기가 늘어납니다(따라서 메모리 사용량이 늘어납니다).
p 평행계수
t T를 늘리면 메모리 사용량을 늘리지 않고도 런타임이 늘어납니다.
g 원래 비밀번호를 알 필요 없이 저장된 비밀번호 해시를 강화하는 데 사용되는 해시 "업그레이드" 횟수
NROM 키가 의존하는 결과 ROM
DKLen 내보낸 키의 길이(출력)

체재

$7$해시가 다음을 사용하는 경우 :

  • N- 1바이트(문자)로 인코딩
  • r- 5바이트(문자)로 인코딩됩니다.
  • p- 5바이트(문자)로 인코딩됩니다.

$7$뜻하기도 하니까고정 길이 인코딩, 각 매개변수에는 인코딩할 바이트 수가 미리 지정되어 있으며 각 매개변수의 순서는 다음과 같습니다. $7$Nrrrrrppppp$....$

[]각 바이트를 대괄호 로 묶습니다 . $7$[N][r1][r2][r3][r4][r5][p1][p2][p3][p4][p5]$... $. 또한 이는 필요한 바이트의 정확한 수가 11임을 의미합니다.컴팩트하지 않음) 지정된 순서의 매개변수에 대해.

반면 해시 값에는 $y$세 가지 매개변수가 필요합니다.

  • flags- 인코딩에는 최소 1바이트(문자) 이상을 사용하세요.
  • N- 인코딩에는 최소 1바이트(문자) 이상을 사용하세요.
  • r- 인코딩에는 최소 1바이트(문자) 이상을 사용하세요.

그래도 $y$해시는 모든 매개변수로 인코딩하여 사용할 수 있습니다.가변 길이. 실제로 이는 각 매개변수 앞에 고유한 크기가 붙는 것을 의미합니다.#첫 번째 바이트로 인코딩하고 계속#바이트:

$y$[flags_len=#][flags1].........[flags#][N_len=#][N1][N#][r_len=#][r1]$$

상황을 더 복잡하게 만들기 위해 필수 매개변수 뒤에 선택적 매개변수가 옵니다.have범위. 의 가치 have에 따르면네 비밀번호결정하다만약 있다면, pt또한 제공된 데이터의 일부 g입니다 .NROM

매개변수에 대한 포괄적인 가이드와 어떤 상황에서 어떤 매개변수를 사용해야 하는지 알아보려면 다음을 참조하는 것이 가장 좋습니다.yescrypt PARAMETERS문서OpenWall GitHub에서.

코딩

매개변수 필드 디코딩은 다음을 통해 수행됩니다.decode64_uint32(), 이는대량으로,색인통과atoi64().현재 바이트의 ASCII 값과 기본 마침표 문자(46)의 차이:

atoi64_partial[77] = {
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
  64, 64, 64, 64, 64, 64, 64,
  12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
  25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
  64, 64, 64, 64, 64, 64,
  38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
  51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63
};

각 필드에 대해 첫 번째 필드 바이트부터 시작하여 yescrypt다음을 수행합니다.

  1. 첫 번째 필드 바이트 사용인덱스 배열상술 한 바와 같이.
  2. 얻을 배열 항목을 계산합니다.필드의 부분 값.
  3. 얻을 배열 항목을 계산합니다.후속 바이트 수필드 값의 나머지 부분을 인코딩합니다.
  4. 각각다음 바이트, 알고리즘은 이를 사용하여배열을 다시 인덱싱합니다.그리고데이터 추가최종 필드 값에 도달합니다.

다른 프로세스에 대한 일부 의사코드가 있습니다.BitcoinWiki Yescrypt 기능부분.

데모 매개변수 인코딩

PARAMETERS위 파일의 예를 들어 보겠습니다 .

  • flags = YESCRYPT_DEFAULTS
  • N = 4096
  • r = 32
  • p = 1
  • t = 0
  • g = 0
  • NROM = 0

위의 값 집합은 표준으로 설명됩니다.크고 느림(메모리 사용량 16MiB, bcrypt 성능 비용 등 2^8 - 10-30ms 대기 시간, 16코어 서버에서 초당 처리량 1000+)선택하다사용자 인증을 위한 비밀번호 해싱, ROM 없음.

$y$서명입니다.

flags = YESCRYPT_DEFAULT = 182 = 0xB6 = j존재하다yescrypt가변 길이 인코딩.

여기서는 다음과 같이 정의된 와 동일한 flags로 디코딩되어야 합니다 .YESCRYPT_DEFAULTYESCRYPT_RW_DEFAULTS(YESCRYPT_RW | YESCRYPT_ROUNDS_6 | YESCRYPT_GATHER_4 | YESCRYPT_SIMPLE_2 | YESCRYPT_SBOX_12K)

  • YESCRYPT_RW = 0x002
  • YESCRYPT_ROUNDS_6 = 0x004
  • YESCRYPT_GATHER_4 = 0x010
  • YESCRYPT_SIMPLE_2 = 0x020
  • YESCRYPT_SBOX_12K = 0x080

구현하다논리적ORyescrypt최종 숫자를 도출하고 인코딩하는 작업을 수행합니다 .

N = 4096 = 0x1000 = 9존재하다yescrypt가변 길이 인코딩. 실제로,N = 2 decoding_N_fields.

r = 32 = 0x20 = T존재하다yescrypt가변 길이 인코딩.

$이는 yescript선택적 매개변수가 지정되지 않았음을 나타냅니다.

마침내,소금추가되었습니다. 이론적으로는 길이에 제한이 없습니다. 하지만,소금의 길이는 4의 거듭제곱이어야 합니다..

$y$j9T$SALT$

위의 설명을 완료한 후 시각적으로 도움이 될 수 있는 유효하지만 안전하지 않은 예는 다음과 같습니다.

  • $7$9/..../..../$SALTS$
  • $y$./.$SALT$
  • $y$8/.$SALT$

관련 정보