Giá trị băm MD5 khác với Bash và PHP [trùng lặp]


60

Câu hỏi này đã có câu trả lời ở đây:

Tôi đã cố gắng tạo tổng MD5 (sử dụng md5sum) của một chuỗi, "xin chào". Tôi đã thử các phương thức khác nhau như công cụ md5sum trong Linux, hàm MD5 () của PHP cũng như các văn bản trực tuyến khác nhau cho các dịch giả md5sum.

echo "hello" | md5sum

echo "hello" > file && md5sum file

Đã cho kết quả b1946ac92492d2347c6235b4d2611184. Tuy nhiên, hàm md5 () của PHP và hầu hết tất cả các trình tạo trực tuyến đã cho đầu ra 5D41402ABC4B2A76B9719D911017C592.

Lý do là gì?


38
echo -n "xin chào"
Martin York

Câu trả lời:


80

Theo mặc định, echobao gồm một ký tự dòng mới ở cuối đầu ra. Tuy nhiên, PHP và các trang web trực tuyến bạn đã sử dụng không bao gồm dòng mới. Để chặn ký tự dòng mới, sử dụng -ncờ:

echo -n "hello" | md5sum

Đầu ra:

5d41402abc4b2a76b9719d911017c592 -

Xem: help echo


hoặc với printf:

printf "%s" "hello" | md5sum

Tôi sẽ đề nghị hiển thị biểu mẫu tương thích rộng rãi hơn trước biểu mẫu dựa trên hành vi không được chỉ định bởi POSIX.
Charles Duffy

Cảm ơn bạn. Tôi thích thể hiện vấn đề trước tiên bằng ví dụ của chính mình và hành vi của tiếng vang.
Cyrus

7
Trừ khi bạn biết hệ điều hành của OP, bạn sẽ không biết rằng phiên bản sửa đổi của "ví dụ của chính họ" sẽ thực sự hoạt động. echo -ncó thể lặp lại -nnếu Linux của họ đang sử dụng Busybox bị loại bỏ.
Charles Duffy

Tôi biết hệ điều hành của OP.
Cyrus

Họ chỉ định kernel của họ, nhưng họ nói gì hơn thế?
Charles Duffy

100

Câu trả lời của @ Cyrus chính xác là cách giải quyết vấn đề này - để giải thích, khi sử dụng echonó sẽ xuất ra một dòng mới ở cuối chuỗi. Như bạn có thể thấy trên đầu ra trực tuyến này, hellovới đầu ra dòng mới chính xác là MD5 bạn đã nhận được trước đó. Sử dụng -ntriệt tiêu dòng mới, và sau đó sẽ cung cấp cho bạn kết quả mà bạn mong đợi.

nhập mô tả hình ảnh ở đây

Chỉnh sửa :

Bạn có thể thấy nó rõ ràng nếu bạn xuất nó ra hexdump, nó hiển thị thập lục phân của các byte ở đó.

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

Xem dấu 0a( \n) ở cuối chuỗi

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

Với -necho không đặt một dòng mới ( \n) vào cuối

Bây giờ với một chuỗi rỗng

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

Chỉ là nhân vật Dòng mới

$ echo -n  "" | hd

Chuỗi rỗng, vì vậy hexdumphiển thị không có đầu ra


2
Sẽ rất thú vị hơn để ống echo helloecho -n hellođể hexdump -Ctương ứng;)
Tom Yan

19
Tôi khuyên bạn nên chống lại echo -n, vì nó không đạt tiêu chuẩn và được hỗ trợ không nhất quán (xem Thông số Unix duy nhấtechodanh mục chi tiết hơn về sự không tương thích của Sven Mascheck ). Trong bạn muốn nó hoạt động ổn định, sử dụng printfthay thế; nó phức tạp hơn một chút để sử dụng (bạn phải chỉ định một chuỗi định dạng bên cạnh dữ liệu bạn muốn in), nhưng IMO đáng để tránh rắc rối. Trong trường hợp này, printf "%s" "hello"sẽ làm thủ thuật.
Gordon Davisson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.