Tôi quan sát hành vi này trong OpenSSL 1.0.0e trên Ubuntu 11.10, trong khi OpenSSL 0.9.8k và 0.9.8t chỉ xuất ra hàm băm. Dòng lệnh của OpenSSL không được thiết kế để linh hoạt, đó là một cách nhanh chóng và bẩn thỉu để thực hiện các phép tính mật mã từ dòng lệnh.
Nếu bạn muốn sử dụng OpenSSL, hãy lọc đầu ra:
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'
Trên Linux (với các công cụ GNU hoặc BusyBox), bạn có thể sử dụng sha1sum
, không yêu cầu OpenSSL phải được cài đặt và có định dạng đầu ra ổn định. Nó luôn in một tên tập tin, vì vậy hãy loại bỏ nó.
echo -n "foo" | sha1sum | sed 's/ .*//'
Trên các hệ thống BSD bao gồm OSX, bạn có thể sử dụng sha1
.
echo -n "foo" | sha1 -q
Tất cả những đầu ra này tổng kiểm tra theo hệ thập lục phân theo sau là một dòng mới. Văn bản trong các hệ thống unix luôn bao gồm một chuỗi các dòng và mỗi dòng kết thúc bằng một ký tự dòng mới. Nếu bạn lưu trữ đầu ra của lệnh trong một biến shell, dòng mới cuối cùng sẽ bị loại bỏ.
digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')
Nếu bạn cần chuyển đầu vào vào một chương trình yêu cầu tổng kiểm tra không có dòng mới cuối cùng (điều này thực sự hiếm), hãy loại bỏ dòng mới.
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program