MD5 해시 값이 Bash 및 PHP와 다릅니다. [중복]


60

이 질문에는 이미 답변이 있습니다.

"hello"라는 문자열 의 MD5 합계 (md5sum 사용) 를 생성하려고했습니다 . Linux의 md5sum 도구, PHP의 MD5 () 함수 및 md5sum 변환기에 대한 다양한 온라인 텍스트와 같은 다양한 방법을 시도했습니다.

echo "hello" | md5sum

echo "hello" > file && md5sum file

결과를 주었다 b1946ac92492d2347c6235b4d2611184. 그러나 PHP의 md5 () 함수와 거의 모든 온라인 생성기는 출력을 제공했습니다 5D41402ABC4B2A76B9719D911017C592.

이유가 무엇입니까?


38
echo -n "hello"
Martin York

답변:


80

기본적으로 echo출력 끝에 줄 바꿈 문자가 포함됩니다. 그러나 PHP와 사용한 온라인 사이트에는 줄 바꿈이 포함되지 않습니다. 개행 문자를 표시하지 않으려면 -n플래그를 사용하십시오 .

echo -n "hello" | md5sum

산출:

5d41402abc4b2a76b9719d911017c592-

보다: help echo


또는 printf로 :

printf "%s" "hello" | md5sum

나는 더 광범위하게 호환 양식을 보여주는 제안 하기 전에 POSIX에 의해 지정되지 않은 행동에 의존 하나.
Charles Duffy

감사합니다. 나는 자신의 예와 메아리 동작으로 문제를 먼저 보여주는 것을 선호합니다.
Cyrus

7
OP의 운영 체제를 모르면 수정 된 "자신의 예"버전이 실제로 작동하는지 알 수 없습니다. 리눅스가 잘린 Busybox를 사용하고 있다면 echo -n반향 할 수 -n있습니다.
Charles Duffy

OP의 운영 체제를 알고 있습니다.
Cyrus

그들은 커널을 지정하지만 그 이상을 어디에 말합니까?
Charles Duffy

100

@ Cyrus의 대답은 이것을 해결하는 방법과 정확히 일치 echo합니다. 사용하면 문자열 끝에 줄 바꿈이 출력됩니다. 이 온라인 출력에서 ​​볼 수 있듯이 hello개행은 이전에 얻은 MD5와 정확히 일치합니다. 를 사용 -n하면 줄 바꿈이 표시되지 않으며 예상 한 결과가 나타납니다.

여기에 이미지 설명을 입력하십시오

편집 :

에 출력하면 명확하게 볼 수 있습니다 hexdump. 바이트의 16 진수가 표시됩니다.

$ echo "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65 0a              |str_example.|

문자열 끝의 0a( \n)를 참조하십시오

$ echo -n "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65                 |str_example|

-necho를 사용 \n하면 끝에 새 줄 ( )을 넣지 않습니다

이제 빈 문자열로

$ echo  "" | hd
00000000  0a                                                |.|

줄 바꿈 문자 만

$ echo -n  "" | hd

빈 문자열이므로 hexdump출력 이 표시되지 않습니다


2
파이프에 더 재미있을 것입니다 echo helloecho -n hellohexdump -C) 각각
톰 연의

19
echo -n비표준이고 일관성이 지원되지 않기 때문에 ( Sven Mascheck 의 단일 echo비 호환성자세한 비 호환성 카탈로그 참조) 권장 하지 않습니다 . 일관되게 작동하려면 printf대신 사용하십시오. 사용하기가 조금 더 복잡하지만 (인쇄하려는 데이터 외에도 형식 문자열을 지정해야 함), IMO는 문제를 피하기 위해 가치가 있습니다. 이 경우 printf "%s" "hello"트릭을 수행합니다.
Gordon Davisson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.