Apakah ada skrip bash untuk menghasilkan HMAC-SHA1
hash?
Saya mencari sesuatu yang setara dengan kode PHP berikut:
hash_hmac("sha1", "value", "key");
Jawaban:
Saya menyadari ini bukan yang Anda minta, tetapi tidak ada gunanya menemukan kembali roda dan menulis versi bash.
Anda cukup menggunakan openssl
perintah untuk menghasilkan hash dalam skrip Anda.
[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Atau sederhananya:
[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Ingatlah untuk digunakan -n
denganecho
atau karakter jeda baris ditambahkan ke string dan itu mengubah data dan hash Anda.
Perintah itu berasal dari paket OpenSSL yang seharusnya sudah diinstal (atau dengan mudah diinstal) dalam pilihan Anda di Linux / Unix, Cygwin, dan sejenisnya.
Perhatikan bahwa versi lama openssl
(seperti yang dikirimkan dengan RHEL4) mungkin tidak menyediakan -hmac
opsi.
Sebagai solusi alternatif, tetapi terutama untuk membuktikan bahwa hasilnya sama, kita juga dapat memanggil PHP hmac_sha1()
dari baris perintah:
[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
sha1
diganti dengan sha256
:-)
openssl genrsa
? Juga, tautan dokumentasi openssl menghasilkan 404.
Berikut adalah fungsi bash yang bekerja seperti hash_hmac
dari PHP:
#!/bin/bash
function hash_hmac {
digest="$1"
data="$2"
key="$3"
shift 3
echo -n "$data" | openssl dgst "-$digest" -hmac "$key" "$@"
}
# hex output by default
hash_hmac "sha1" "value" "key"
# raw output by adding the "-binary" flag
hash_hmac "sha1" "value" "key" -binary | base64
# other algos also work
hash_hmac "md5" "value" "key"
hash_hmac "sha1" "$(cat your-json-file)" "key"
. Atau Anda bisa menyalurkan file Anda openssl dgst
tanpa menggunakan hash_hmac
fungsi ini .
Terima kasih untuk fungsi hash_hmac! Tapi itu tidak cukup untuk lamaran saya. Jika ada yang bertanya-tanya, saya harus melakukan hash ulang beberapa kali menggunakan kunci yang merupakan hasil dari hashing sebelumnya, dan karena itu merupakan input biner. (Tanda tangan otentikasi Amazon AWS dibuat seperti ini.)
Jadi yang saya butuhkan adalah cara untuk menyediakan kunci biner dengan cara tertentu yang tidak akan merusak algoritme. Kemudian saya menemukan ini: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html
Balasan Stephen Henson membutuhkan fungsi hash_hmac untuk mengembalikan nilai dalam format hex. Jadi perlu menggemakan hal berikut:
$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'
Kemudian panggilan berikutnya perlu memberikan kunci sebagai hexit:
$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'
Semoga ini membantu siapa saja, mungkin seseorang yang mencoba membuat skrip bash untuk membatalkan entri CloudFront di AWS (seperti saya!) (Saya belum mengujinya, tapi menurut saya inilah hal yang menjadi penyebab mengapa skrip bash saya tidak berfungsi, dan PHP saya tidak ...)
Bagi mereka yang ingin menjelajahi lebih banyak JWT di baris perintah: skrip jwt bash keren