"openssl passwd"의 출력이 매번 다른 이유는 무엇입니까?

"openssl passwd"의 출력이 매번 다른 이유는 무엇입니까?

openssl passwd 명령은 런타임에 입력된 비밀번호 또는 목록의 각 비밀번호에 대한 해시를 계산합니다. 비밀번호 목록은 -in 옵션으로 지정된 파일, -stdin 옵션으로 표준 입력에서, 그렇지 않으면 명령줄에서 가져옵니다. UNIX 표준 알고리즘 crypt와 MD5 기반 BSD 암호화 알고리즘 1 및 해당 Apache 변형 apr1을 모두 사용할 수 있습니다.

나는 "해시"라는 단어가 "를 의미하는 것으로 이해합니다.입력을 원래 입력을 도출하기 어렵거나 불가능한 출력으로 변환보다 구체적으로, 해시된 입력:출력 관계는 N:M입니다. 여기서 M <= N(즉, 해시 충돌이 가능합니다).

openssl passwd동일한 입력으로 " "를 연속적으로 실행하면 출력이 다른 이유는 무엇입니까?

> openssl passwd
Password:
Verifying - Password:
ZTGgaZkFnC6Pg
> openssl passwd
Password:
Verifying - Password:
wCfi4i2Bnj3FU
> openssl passwd -1 "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/
> openssl passwd -1 "a"
$1$JhSBpnWc$oiu2qHyr5p.ir0NrseQes1

이 함수는 마치 실행 중인 것처럼 보이기 때문에 이 함수의 목적을 이해하지 못할 것입니다.동일한 입력에 동일한 해시 알고리즘을 사용하면 여러 개의 고유한 출력이 생성됩니다.. M>N인 것처럼 보이는 N:M 입력:출력 관계 때문에 혼란스러워하는 것 같습니다.

답변1

> openssl passwd -1 "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/

이는 확장된 Unix 스타일 crypt(3)비밀번호 해싱 구문, 특히 MD5 버전입니다.

첫 번째 부분은 $1$해시 유형을 식별하고, 다음 부분 OKgLCmVl은 비밀번호를 암호화하는 데 사용되는 솔트이며, 구분 기호 다음 $줄 끝까지는 실제 비밀번호 해시입니다.

따라서 첫 번째 암호화에서 솔트 부분을 가져와 후속 암호화에 사용하면 항상 동일한 결과를 얻을 수 있습니다.

> openssl passwd -1 -salt "OKgLCmVl" "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/
> openssl passwd -1 -salt "OKgLCmVl" "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/

당신이 있을 때비밀번호 변경, 항상 새 소금으로 바꿔야 합니다. 이렇게 하면 새 비밀번호가 실제로 이전 비밀번호와 동일한지 나중에 다른 사람이 알아내는 것을 방지할 수 있습니다. (이전 비밀번호의 재사용을 방지하려면 물론 새 비밀번호 후보를 두 번 해시할 수 있습니다. 한 번은 이전 비밀번호로, 그 다음에는 결과가 이전 비밀번호와 달라 허용 가능한 경우 새 비밀번호 솔트로 다시 해시합니다.)

옵션을 사용하지 않으면 dave_thompson_085에 설명된 대로 openssl passwd원래 crypt(3)호환 해시를 얻습니다. 이를 통해 소금은 해시의 처음 두 글자입니다.

> openssl passwd "a"
imM.Fa8z1RS.k
> openssl passwd -salt "im" "a"
imM.Fa8z1RS.k

새로운 구현에서는 이 오래된 해싱 스타일을 사용해서는 안 됩니다. 왜냐하면 유효한 암호 길이를 8자로 제한하고 솔트가 너무 적어서 현대적인 방법으로부터 적절하게 보호할 수 없기 때문입니다.

(각 클래식 해시에 대해 전체 레인보우 테이블 세트를 저장하는 데 필요한 데이터 양을 계산한 적이 있습니다 crypt(3). 정확한 결과는 기억나지 않지만 계산이 정확하다고 가정하면 "보통 멀티 스택" 정도입니다. 너무 바이트 디스크"입니다. 제 생각에는 이것은 "조직적인 범죄자가 이것을 할 수 있습니다"의 범위 내에 있다고 생각합니다.)

답변2

일반 해시와는 다르게비밀번호해시 값은 "소금"을 사용해야 합니다.그리고해시를 획득한 공격자가 암호를 쉽게 복구하지 못하도록 (일반적으로 반복을 통해) 느려져야 합니다. 바라보다안전 사양.SX그리고 그와 관련된 많은 것.

이것1970년대 오리지널 지하실 (3), 이제 명확성을 위해 DEScrypt라고 합니다.(약간) 절인:

소금[a-zA-Z0-9./] 세트에서 선택된 2문자 문자열입니다. 이 문자열은 4096가지 방법 중 하나로 알고리즘을 교란하는 데 사용됩니다.

약간 더 새로운 MD5crypt 체계가 솔트되고 반복되었지만 현대 표준에는 미치지 못했습니다. 이 두 가지 옵션과 이를 Unix에서 대체할 수 있는 더 나은 대안은 다음과 같습니다.https://en.wikipedia.org/wiki/Crypt_%28C%29.

답변3

사용자무루맞습니다. 비밀번호가 솔트 처리되었습니다.

옵션을 직접 추가할 수 -salt string있으며 해시 값은 동일하게 유지됩니다.

$ openssl passwd -salt "foo" "bar"
foXrpAKGo3142
$ openssl passwd -salt "foo" "bar"
foXrpAKGo3142

관련 정보