HMAC-SHA1 en bash


¿Hay un script bash para generar un hash HMAC-SHA1?

Estoy buscando algo equivalente al siguiente código PHP:

hash_hmac("sha1", "value", "key");
Author: Ilmari Karonen, 2011-09-02

4 answers

Me doy cuenta de que esto no es exactamente lo que estás pidiendo, pero no tiene sentido reinventar la rueda y escribir una versión bash.

Simplemente puede utilizar el openssl comando para generar el hash dentro de su script.

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

O simplemente:

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

Recuerde usar -n con echo o de lo contrario se agregará un carácter de salto de línea a la cadena y eso cambiará sus datos y el hash.

Ese comando viene del paquete OpenSSL que ya debería ser instalado (o fácilmente instalado) en su elección de Linux/Unix, Cygwin y similares.

Tenga en cuenta que las versiones anteriores de openssl (como la incluida con RHEL4) pueden no proporcionar la opción -hmac.


Como solución alternativa, pero principalmente para demostrar que los resultados son los mismos, también podemos llamar a PHP hmac_sha1() desde la línea de comandos:

[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
 150
Author: Shawn Chin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-14 19:38:07

Aquí hay una función bash que funciona como hash_hmac desde 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"
 34
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-12 08:36:19

Gracias por la función hash_hmac! Pero no fue suficiente para mi solicitud. En caso de que alguien se preguntara, tuve que volver a hash cosas varias veces usando una clave que era el resultado del hash anterior, y por lo tanto es una entrada binaria. (La firma de autenticación de Amazon AWS se crea así.)

Así que lo que necesitaba era una forma de suministrar la clave binaria de alguna manera que no rompiera el algoritmo. Entonces encontré esto.: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

La respuesta de Stephen Henson requiere que la función hash_hmac devuelva el valor en formato hexadecimal. Así que necesita hacer eco de lo siguiente:

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

Entonces la siguiente llamada tendría que proporcionar la clave como un hexit:

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

Esperemos que esto ayude a cualquier persona, probablemente alguien que esté tratando de crear scripts bash para invalidar las entradas de CloudFront en AWS (¡como yo!) (Todavía no lo he probado, pero creo esta es la causa de por qué mi script bash no funciona, y mi PHP sí...)

 4
Author: Wouter Thielen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-13 05:13:58

Para aquellos que les gusta explorar más JWT en la línea de comandos: cool jwt bash script

 0
Author: ifelsemonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-07 23:04:51