Pregunta HMAC-SHA1 en bash


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

Estoy buscando algo equivalente al siguiente código PHP:

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

74
2017-09-02 14:36


origen


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

Puedes simplemente usar el openssl comando para generar el hash dentro de su secuencia de comandos.

[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 si no, 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 el enviado con RHEL4) puede no proporcionar el -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 comando:

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

145
2017-09-02 14:52



Aquí hay una función bash que funciona como hash_hmac de 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



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


3
2018-03-13 05:13



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


0
2018-02-07 23:04