sheet - HMAC-SHA1 en bash
vim cheat sheet (4)
¿Hay un script bash para generar un hash HMAC-SHA1
?
Estoy buscando algo equivalente al siguiente código PHP:
hash_hmac("sha1", "value", "key");
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"
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 manipular cosas varias veces usando una clave que fue el resultado del hashing 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 suministrar la clave binaria de una manera que no rompa 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. Por lo tanto, debe hacerse eco de lo siguiente:
$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e ''s/^.* //''
Entonces, la próxima 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 a alguien que esté intentando crear scripts bash para invalidar las entradas de CloudFront en AWS (como yo!) (Aún no lo he probado, pero creo que esta es la causa de por qué mi script bash no funciona, y mi PHP lo hace ...)
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 usar el comando openssl
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 bien 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 instalarse fácilmente) en su elección de Linux / Unix, Cygwin y similares.
Tenga en cuenta que las versiones anteriores de openssl
(como las enviadas con RHEL4) pueden no proporcionar la opción -hmac
.
Como una solución alternativa, pero principalmente para probar que los resultados son los mismos, también podemos llamar a PHP hmac_sha1()
desde la línea de comando:
[me@home]$ echo ''<?= hash_hmac("sha1", "value", "key") ?>'' | php
57443a4c052350a44638835d64fd66822f813319
Para aquellos que les gusta explorar más JWT en la línea de comandos: cool jwt bash script