Respuestas:
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 de bash.
Simplemente puede usar 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 agrega un carácter de salto de línea a la cadena y eso cambia sus datos y el hash.
Ese comando proviene del paquete OpenSSL que ya debería estar instalado (o instalado fácilmente) en su elección de Linux / Unix, Cygwin y similares.
Tenga en cuenta que es posible que las versiones anteriores de openssl
(como la que se envía con RHEL4) no ofrezcan la -hmac
opción.
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
sha1
se reemplaza con sha256
:-)
openssl genrsa
? Además, el enlace de documentación de openssl da como resultado un 404.
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"
hash_hmac "sha1" "$(cat your-json-file)" "key"
. Alternativamente, puede canalizar su archivo openssl dgst
sin usar esta hash_hmac
función.
¡Gracias por la función hash_hmac! Pero no fue suficiente para mi aplicación. En caso de que alguien se preguntara, tuve que volver a hacer hash 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í).
Entonces, lo que necesitaba era una forma de proporcionar la clave binaria de alguna manera que no rompiera el algoritmo. Luego 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. Por lo que debe hacerse eco de lo siguiente:
$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'
Luego, la siguiente llamada debería proporcionar la clave como un hexit:
$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'
Espero que esto ayude a cualquiera, probablemente alguien que esté tratando de crear scripts bash para invalidar entradas de CloudFront en AWS (¡como yo!) (No lo he probado todavía, pero creo que esta es la causa de por qué mi script bash no funciona, y mi PHP uno sí ...)
Para aquellos a los que les gusta explorar más JWT en la línea de comandos: genial script jwt bash