HMAC-SHA1 dalam pesta

95

Apakah ada skrip bash untuk menghasilkan HMAC-SHA1hash?

Saya mencari sesuatu yang setara dengan kode PHP berikut:

hash_hmac("sha1", "value", "key");
Menandai
sumber

Jawaban:

187

Saya menyadari ini bukan yang Anda minta, tetapi tidak ada gunanya menemukan kembali roda dan menulis versi bash.

Anda cukup menggunakan opensslperintah 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 -ndenganecho 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 -hmacopsi.


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
Shawn Chin
sumber
Implementasi OpenSSL sangat lambat. Jika Anda perlu melakukannya sesekali tidak apa-apa, tetapi jika Anda mencoba menghitung jumlah besar dari hash, Anda ingin menyelidiki jalan yang berbeda.
Marcin
1
@ Marcin: dapatkah Anda mengutip sumber dengan itu?
lihat
6
Saya memiliki pertanyaan yang sama dengan HMAC-SHA256. Solusi yang sama, tetapi sha1diganti dengan sha256:-)
mogsie
1
Ya, Anda bisa, tapi hati-hati dengan penggalan baris dalam file Anda karena itu juga akan dianggap sebagai bagian dari nilai.
Shawn Chin
1
@ShawnChin, dalam contoh ini, apa encoding / format kunci tersebut? Haruskah itu pengkodean base64 seperti kunci pribadi yang dibuat menggunakan openssl genrsa? Juga, tautan dokumentasi openssl menghasilkan 404.
Carlos Macasaet
40

Berikut adalah fungsi bash yang bekerja seperti hash_hmacdari 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"
Martin
sumber
Itu cara yang bagus untuk menyelesaikannya. +1
Shawn Chin
+1 karena tidak seperti jawaban yang dipilih, yang ini menjawab pertanyaan yang diajukan. (Meskipun keduanya membantu.)
Alexx Roche
Tapi, bagaimana Anda meneruskan argumen 'data' ke skrip jika multi baris? Seperti badan xml atau json tanpa kehilangan lekukan.
HyperioN
@HyperioN jika Anda memiliki data json Anda dalam file Anda hanya bisa melakukan ini: hash_hmac "sha1" "$(cat your-json-file)" "key". Atau Anda bisa menyalurkan file Anda openssl dgsttanpa menggunakan hash_hmacfungsi ini .
Martin
9

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 ...)

Wouter Thielen
sumber
-2

Bagi mereka yang ingin menjelajahi lebih banyak JWT di baris perintah: skrip jwt bash keren

eigenfield.dll
sumber