Bash 스크립트에서 HMAC-SHA512 다이제스트를 계산하고 싶습니다. 지금까지 나는 여러 다른 웹사이트에서 이 내용만 여러 번 반복하는 것을 발견했습니다.
echo -n message | openssl dgst -sha256 -hmac secret -binary >message.mac
분명히 비밀 문자열을 프로그램에 전달하는 올바른 방법이 아니라는 사실을 아무도 깨닫지 못합니다. 비밀은 시스템에서 실행 중인 다른 모든 프로세스의 프로세스 목록에 표시되기 때문입니다. 비밀을 전달하기 위한 더 나은 인터페이스를 사용하여 셸에서 HMAC를 쉽게 생성할 수 있는 다른 방법(아마도 다른 도구 사용)이 있습니까?
고쳐 쓰다
~/bin/hmac
현재 다음 도구( )를 사용하고 있습니다. 환경 변수에서 키를 가져옵니다 MACKEY
.
#!/usr/bin/env python3
import hmac, sys, os
key = os.environ['MACKEY'].encode('utf-8')
algo = os.getenv('MACALGO', 'sha512')
digest = hmac.new(key, digestmod = algo)
while True:
buf = sys.stdin.buffer.read(512)
if not buf:
break
digest.update(buf)
print(digest.hexdigest())
용법:
echo -n message | MACKEY=foobar hmac
답변1
리디렉션은 매개변수 목록의 일부가 아닙니다.
이것은 엿보는 눈으로부터 안전한 것으로 간주됩니다.
cmd </file/key
cmd <<<"key"
이름 없는 파이프는 스크립트 내에서도 사용할 수 있습니다.
echo "secret" | cmd
따라서 이 스크립트는 안전한 것으로 간주됩니다.
#!/bin/bash
read secretkey </dev/stdin
var="<?= hash_hmac(\"sha512\", \"$1\", \"$secretkey\"); ?>"
php7.1 <<<"$var"
키를 파일에 저장할 수 있는 경우 </dev/stdin
이를 .</dir/keyfile
버전 은 stdin
다음과 같이 사용하세요.
./script "Message" <<<"secretkey"
답변2
나도 같은 질문을 한 적이 있다OpenSSL 메일링 리스트
Fedora 37 또는 RHEL 8을 사용하는 경우 이 libkcapi-hmaccalc
패키지 는 등을 제공합니다 sha1hmac
.sha512hmac
따라서 다음을 대체할 수 있습니다.
$ echo -n toto | openssl dgst -hmac tata -sha1
SHA1(stdin)= 6c497bab7bcc37d768364b570445ee10a4fb17d6
그리고
$ echo -n toto | sha1hmac -k <(echo -n tata)
6c497bab7bcc37d768364b570445ee10a4fb17d6
바라보다매뉴얼 페이지
이렇게 하면 프로세스 목록에서 키가 유출되는 것을 방지할 수 있습니다(키가 Bash 기록에 기록되지 않았는지 확인해야 하지만 이는 질문의 범위가 아닙니다).