Làm thế nào tôi có thể nhận được một shaX được mã hóa base64 trên cli?


31

sha1sumxuất ra một định dạng mã hóa hex của sha thực tế. Tôi muốn xem một biến thể được mã hóa base64. có thể một số lệnh xuất ra phiên bản nhị phân mà tôi có thể tạo ra, như vậy: echo -n "message" | <some command> | base64hoặc nếu nó xuất ra trực tiếp thì điều đó cũng tốt.

Câu trả lời:


40

Nếu bạn có tiện ích dòng lệnh từ OpenSSL , nó có thể tạo ra một bản tóm tắt ở dạng nhị phân và thậm chí nó có thể dịch sang base64 (trong một lệnh gọi riêng).

echo -n foo | openssl dgst -binary -sha1 | openssl base64

1
echo foo | openssl dgst -binary -sha1 | base64là tương đương, và có lẽ là cách sạch nhất để làm điều này.
xenoterracide

3
Sử dụng opensslcho base64 cũng có lợi thế là chỉ phụ thuộc vào một công cụ ( ksh: base64: not found).
Gilles 'SO- ngừng trở nên xấu xa'

2
Đối với băm thông báo tiêu hóa lớn như sha512, bạn có thể muốn thêm -Atùy chọn vào openssl base64lệnh cuối cùng , để ngăn chia chuỗi kết quả thành nhiều dòng.
mykhal

@Gilles Tại sao echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64tạo ra một chuỗi khác nhau?
georgeliatsos

@gliatsos Vì echo -n fooecho foosản xuất các chuỗi khác nhau.
Gilles 'SO- ngừng trở nên xấu xa'

15

sha1sumkhông cung cấp tùy chọn cho đầu ra nhị phân, bạn có thể sẽ cần tìm một tiện ích ngược lại odvà đặt chúng. Lấy gợi ý của fschmitt để sử dụng xxdvới cờ 'đảo ngược' và 'bãi rác đơn giản', nó sẽ trông như thế này:

sha1sum | cut -f1 -d\ | xxd -r -p | base64


4
Sử dụng xxd với cờ -rp. Như thế này: sha1sum somefile.txt | cắt -f1 -d \ | xxd -r -p | cơ
sở64

@fschmitt: Đáng lẽ tôi nên đọc bình luận này trước khi đăng câu trả lời của mình, nó sạch sẽ hơn nhiều. Bạn nên xem xét việc đăng nó như một câu trả lời. Tôi sẽ bình chọn cho nó.
Steven D

Đó là câu trả lời của alex nhiều hơn, tôi vừa googled "convert hex binary unix", vì vậy alex, hãy thoải mái chỉnh sửa câu trả lời của bạn để bao gồm cuộc gọi xxd và chúng tôi sẽ bỏ phiếu này.
fschmitt

Chỉnh sửa câu trả lời của tôi. Cảm ơn bạn đã chỉ xxdra :)
alex

tuyệt vời! Điều này thật khó để tìm ra từ tài liệu httpd.apache.org/docs/2.4/misc/password_encryptions.html mà không đề cập đến sự cần thiết của bước này
phil294

1

Tôi không hoàn toàn chắc chắn tôi hiểu những gì bạn muốn, nhưng tôi nghĩ một cái gì đó như sau sẽ hoạt động:

$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64

Về cơ bản, tôi lấy đầu ra hex, sử dụng sedđể biến nó thành một chuỗi các giá trị hex được thoát, và sau đó sử dụng echo -enđể lặp lại các byte vào base64.

Chúng tôi có thể xác nhận rằng đầu ra cuối cùng tương ứng với cùng một hàm băm với bài tập sau:

$ echo -n "message" | sha1sum 
6f9b9af3cd6e8b8a73c2cdced37fe9f59226e27d  -

$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64
b5ua881ui4pzws3O03/p9ZIm4n0=

$ echo -n "b5ua881ui4pzws3O03/p9ZIm4n0=" | base64 -d | xxd
0000000: 6f9b 9af3 cd6e 8b8a 73c2 cdce d37f e9f5  o....n..s.......
0000010: 9226 e27d                                .&.}

Kiểm tra trực quan cho thấy giá trị base64 của chúng tôi khớp với hex gốc. Lưu ý rằng nếu bạn sử dụng hexdumpthay vì xxdbạn có thể phải chơi với các cài đặt định dạng một chút để có được đầu ra mà bạn mong đợi.


1

Perl có một mô-đun cơ sở64 (trong phân phối cơ sở kể từ 5.7.1).

echo foo | sha1sum | \
perl -MMIME::Base64 -ne '/^([[:xdigit:]]+)/ and print encode_base64(pack("H*",$1))'

Nếu bạn có Digest::SHAmô-đun (trong phân phối cơ sở kể từ 5.9.3) hoặc Digest::SHA1mô-đun cũ hơn , bạn có thể thực hiện toàn bộ tính toán theo perl. Kể từ perl 5.10.1, b64digestkhông đệm đầu ra base64; Nếu bạn cần đệm, cách dễ nhất là sử dụng MIME::Base64.

perl -MDigest::SHA -e 'print Digest::SHA->new(1)->addfile(*STDIN)->b64digest'
perl -MMIME::Base64 -MDigest::SHA \
     -le 'print encode_base64(Digest::SHA->new(1)->addfile(*STDIN)->digest)'

tốt, nếu chúng ta đang sử dụng perl, chúng ta chỉ có thể sử dụng mô-đun Digest :: SHA cho phép chúng ta xuất trực tiếp lên cơ sở64.
xenoterracide

0

Băm SHA256 được mã hóa Base64 trở thành kiểm tra tệp khá chuẩn trong OpenBSD gần đây .. Có thể thực hiện chỉ bằng cách thêm -btùy chọn vào lệnh OpenBSD sha256(hoặc sha1, sha512):

$ FILE=/dev/null
$ sha256 -q -b $FILE
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

hoặc là:

$ cksum -q -a sha256b $FILE
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.