Bash의 HMAC-SHA1


95

HMAC-SHA1해시 를 생성하는 bash 스크립트가 있습니까?

다음 PHP 코드와 동등한 것을 찾고 있습니다.

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

답변:


185

나는 이것이 당신이 요구하는 것이 아니라는 것을 알고 있지만 바퀴를 재발 명하고 bash 버전을 작성하는 데는 의미가 없습니다.

openssl명령을 사용 하여 스크립트 내에서 해시를 생성 할 수 있습니다 .

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

또는 간단히 :

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

사용하는 것을 기억 -n으로 echo또는 다른 줄 바꿈 문자가 문자열에 추가하고이 데이터와 해시를 변경한다.

이 명령은 Linux / Unix, Cygwin 등의 선택에 이미 설치되어 있거나 쉽게 설치되어 있어야하는 OpenSSL 패키지에서 제공됩니다.

이전 버전 openssl(예 : RHEL4와 함께 제공된 버전 )은 -hmac옵션을 제공하지 않을 수 있습니다.


대체 솔루션이지만 주로 결과가 동일하다는 것을 증명하기 위해 hmac_sha1()명령 줄에서 PHP를 호출 할 수도 있습니다 .

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

OpenSSL 구현은 매우 느립니다. 가끔 그렇게해야하는 경우는 괜찮지 만 대량의 해시를 계산하려는 경우에는 다른 방법을 조사해야합니다.
Marcin 2011 년

1
@Marcin : 출처를 인용 할 수 있습니까?
sehe

6
HMAC-SHA256에 대해서도 같은 질문이있었습니다. 동일한 솔루션이지만 다음 sha1으로 대체됩니다. sha256:-)
mogsie

1
예, 가능하지만 값의 일부로 간주 될 수 있으므로 파일 내에서 줄 바꿈을주의하십시오.
Shawn Chin

1
@ShawnChin,이 예에서 키의 인코딩 / 형식은 무엇입니까? 사용하여 만든 개인 키와 같은 base64 인코딩이어야 openssl genrsa합니까? 또한, (404)에도 OpenSSL 문서 링크 결과
카를로스 Macasaet

40

다음은 hash_hmacPHP에서 와 같이 작동하는 bash 함수입니다 .

#!/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"

그것은 그것을 마무리하는 좋은 방법입니다. +1
Shawn Chin

+1 선택한 답변과 달리 질문에 대한 답변이기 때문입니다. (둘 다 도움이 되긴하지만)
Alexx Roche

그러나 여러 줄인 경우 'data'인수를 스크립트에 어떻게 전달합니까? 들여 쓰기를 잃지 않고 xml 또는 json 본문과 같습니다.
HyperioN

@HyperioN 파일에 json 데이터가있는 경우 간단히 다음과 같이 할 수 hash_hmac "sha1" "$(cat your-json-file)" "key"있습니다.. 또는 openssl dgsthash_hmac함수 를 사용하지 않고 파일을 파이프 할 수도 있습니다.
Martin

9

hash_hmac 함수에 감사드립니다! 하지만 내 신청으로는 충분하지 않았습니다. 누군가 궁금한 경우를 대비하여 이전 해싱의 결과이므로 이진 입력 인 키를 사용하여 여러 번 항목을 다시 해시해야했습니다. (Amazon AWS 인증 서명은 이와 같이 생성됩니다.)

그래서 제가 필요한 것은 알고리즘을 깨지 않는 방식으로 바이너리 키를 제공하는 방법이었습니다. 그런 다음 이것을 찾았습니다 : http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

Stephen Henson의 응답에는 값을 16 진수 형식으로 반환하기 위해 hash_hmac 함수가 필요합니다. 따라서 다음을 반영해야합니다.

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

그런 다음 다음 호출에서 키를 16 진수로 제공해야합니다.

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

바라건대 이것은 AWS에서 CloudFront 항목을 무효화하기 위해 bash 스크립트를 생성하려는 사람 (예 : 나처럼!) (아직 테스트하지 않았지만 이것이 내 bash 스크립트의 원인이라고 생각합니다. 작동하지 않고 내 PHP는 작동합니다 ...)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.