Respostas:
Sei que não é exatamente isso que você está pedindo, mas não adianta reinventar a roda e escrever uma versão do bash.
Você pode simplesmente usar o openssl
comando para gerar o hash em seu script.
[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Ou simplesmente:
[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Lembre-se de usar -n
com, echo
ou então, um caractere de quebra de linha é anexado à string e isso altera seus dados e o hash.
Esse comando vem do pacote OpenSSL que já deve estar instalado (ou facilmente instalado) em sua escolha de Linux / Unix, Cygwin e similares.
Observe que as versões mais antigas do openssl
(como a fornecida com o RHEL4) podem não oferecer a -hmac
opção.
Como solução alternativa, mas principalmente para provar que os resultados são os mesmos, também podemos chamar PHP's hmac_sha1()
da linha de comando:
[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
sha1
foi substituída por sha256
:-)
openssl genrsa
? Além disso, o link de documentação do openssl resulta em um 404.
Aqui está uma função bash que funciona como hash_hmac
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"
. Como alternativa, você pode simplesmente canalizar seu arquivo openssl dgst
sem usar esta hash_hmac
função.
Obrigado pela função hash_hmac! Mas não foi o suficiente para minha aplicação. Caso alguém esteja se perguntando, eu tive que refazer o hash várias vezes usando uma chave que era o resultado do hash anterior e, portanto, é uma entrada binária. (A assinatura de autenticação Amazon AWS é criada assim.)
Então, o que eu precisava era uma maneira de fornecer a chave binária de alguma forma que não quebrasse o algoritmo. Então eu encontrei isto: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html
A resposta de Stephen Henson requer que a função hash_hmac retorne o valor em formato hexadecimal. Portanto, ele precisa ecoar o seguinte:
$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'
Então, a próxima chamada precisaria fornecer a chave como um hexit:
$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'
Espero que isso ajude alguém, provavelmente alguém que está tentando criar scripts bash para invalidar entradas do CloudFront no AWS (como eu!) (Eu não testei ainda, mas acho que é isso que é a causa de porque meu script bash não funciona, e meu PHP funciona ...)
Para aqueles que gostam de explorar mais JWT na linha de comando: cool jwt bash script