Pytanie HMAC-SHA1 w bash


Czy istnieje skrypt bash do generowania HMAC-SHA1 haszysz?

Szukam czegoś podobnego do następującego kodu PHP:

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

76
2017-09-02 14:36


pochodzenie




Odpowiedzi:


Rozumiem, że nie jest to dokładnie to, o co prosisz, ale nie ma sensu wymyślać koła i pisać wersji bash.

Możesz po prostu użyć openssl polecenie generowania skrótu w twoim skrypcie.

[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

Lub po prostu:

[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

Pamiętaj, aby użyć -n z echo albo znak końca linii jest dołączany do łańcucha znaków, który zmienia twoje dane i hash.

To polecenie pochodzi z pakietu OpenSSL, który powinien już być zainstalowany (lub łatwo zainstalowany) w systemie Linux / Unix, Cygwin i tym podobnych.

Zauważ, że starsze wersje openssl (takie jak dostarczane z RHEL4) może nie zapewniać -hmac opcja.


Jako alternatywne rozwiązanie, ale głównie po to, aby udowodnić, że wyniki są takie same, możemy również nazwać PHP hmac_sha1() z wiersza poleceń:

[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319

147
2017-09-02 14:52



Implementacje OpenSSL są bardzo powolne. Jeśli musisz to robić od czasu do czasu, to jest w porządku, ale jeśli próbujesz obliczyć ogromne ilości skrótów, chcesz zbadać różne ścieżki. - Marcin
@Marcin: czy możesz zacytować źródło z tym? - sehe
Miałem to samo pytanie z HMAC-SHA256. To samo rozwiązanie, ale sha1 zastępuje się sha256 :-) - mogsie
Tak, możesz, ale uważaj na łamanie zasad w swoim pliku, ponieważ będzie to również uważane za część wartości. - Shawn Chin
@ShawnChin, w tym przykładzie, jakie jest kodowanie / formatowanie klucza? Powinien to być kodowanie base64, jak klucz prywatny utworzony za pomocą openssl genrsa? Ponadto link do dokumentacji openssl daje 404. - Carlos Macasaet


Oto funkcja bash, która działa jak hash_hmac z 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"

32
2017-09-12 08:36



To dobry sposób na zakończenie. +1 - Shawn Chin
dzięki dla -binary :) - Manav
+1, ponieważ w przeciwieństwie do wybranej odpowiedzi, ten odpowiada na zadane pytanie. (Chociaż oba są pomocne.) - Alexx Roche
@ Mark To powinna być zaakceptowana odpowiedź. - Yokai
ale w jaki sposób przekazujesz argument "dane" do skryptu, jeśli ma on wiele linii? Jak ciało xml lub json bez utraty wcięcia. - HyperioN


Dzięki za funkcję hash_hmac! Ale to nie wystarczyło dla mojej aplikacji. Na wypadek, gdyby ktoś się zastanawiał, musiałem kilka razy powtórzyć hash używając klucza, który był wynikiem poprzedniego hashu, a zatem jest to wejście binarne. (Sygnatura uwierzytelniania Amazon AWS jest tworzona w ten sposób).

Potrzebowałem więc sposobu na dostarczenie klucza binarnego w jakiś sposób, który nie złamałby algorytmu. Potem znalazłem to: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

Odpowiedź Stephena Hensona wymaga, aby funkcja hash_hmac zwracała wartość w formacie szesnastkowym. Musi więc brzmieć następująco:

$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'

Następnie następne wywołanie będzie wymagało podania klucza jako heksadecymalnego:

$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'

Mam nadzieję, że to pomoże każdemu, prawdopodobnie komuś, kto próbuje tworzyć skrypty bash unieważniające wpisy CloudFront na AWS (jak ja!) (Jeszcze tego nie testowałem, ale myślę, że to jest właśnie przyczyna, dlaczego mój skrypt basha nie działa, a mój PHP robi ...)


3
2018-03-13 05:13





Tym, którzy lubią odkrywać więcej JWT w wierszu poleceń: fajny skrypt jwt bash


0
2018-02-07 23:04