HMAC-SHA1 ใน bash


97

มีสคริปต์ทุบตีเพื่อสร้างHMAC-SHA1แฮชหรือไม่?

ฉันกำลังมองหาสิ่งที่เทียบเท่ากับโค้ด PHP ต่อไปนี้:

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

คำตอบ:


194

ฉันตระหนักดีว่านี่ไม่ใช่สิ่งที่คุณต้องการ แต่ก็ไม่มีประโยชน์ในการคิดค้นล้อใหม่และเขียนเวอร์ชันทุบตี

คุณสามารถใช้opensslคำสั่งเพื่อสร้างแฮชภายในสคริปต์ของคุณ

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

หรือเพียงแค่:

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

อย่าลืมใช้-nร่วมกับechoมิฉะนั้นอักขระตัวแบ่งบรรทัดจะต่อท้ายสตริงและเปลี่ยนข้อมูลและแฮชของคุณ

คำสั่งนั้นมาจากแพ็คเกจ OpenSSL ซึ่งควรติดตั้งไว้แล้ว (หรือติดตั้งได้ง่าย) ใน Linux / Unix, Cygwin และสิ่งที่คุณชอบ

โปรดทราบว่าเวอร์ชันเก่ากว่าopenssl(เช่นที่มาพร้อมกับ RHEL4) อาจไม่มี-hmacตัวเลือกให้


ในฐานะที่เป็นทางเลือกอื่น แต่เพื่อพิสูจน์ว่าผลลัพธ์เหมือนกันเป็นหลักเราสามารถเรียก PHP hmac_sha1()จากบรรทัดคำสั่ง:

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

การใช้งาน OpenSSL นั้นช้ามาก หากคุณจำเป็นต้องทำเป็นครั้งคราวก็ไม่เป็นไร แต่ถ้าคุณกำลังพยายามคำนวณแฮชจำนวนมากคุณต้องการตรวจสอบลู่ทางต่างๆ
Marcin

1
@ Marcin: คุณสามารถอ้างอิงแหล่งที่มาได้หรือไม่?
sehe

6
ฉันมีคำถามเดียวกันกับ HMAC-SHA256 วิธีแก้ปัญหาเดียวกัน แต่sha1ถูกแทนที่ด้วยsha256:-)
mogsie

1
ใช่คุณทำได้ แต่ระวังการแตกบรรทัดภายในไฟล์ของคุณเพราะจะถือว่าเป็นส่วนหนึ่งของค่าด้วย
Shawn Chin

1
@ShawnChin ในตัวอย่างนี้การเข้ารหัส / รูปแบบของคีย์คืออะไร? ควรเป็นการเข้ารหัส base64 เหมือนคีย์ส่วนตัวที่สร้างโดยใช้openssl genrsaหรือไม่? นอกจากนี้ลิงก์เอกสาร openssl ยังส่งผลให้เกิด 404
Carlos Macasaet

41

นี่คือฟังก์ชั่นทุบตีที่ใช้งานได้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"

นั่นเป็นวิธีที่ดีในการสรุป +1
Shawn Chin

+1 เนื่องจากไม่เหมือนกับคำตอบที่เลือกคำตอบนี้ตอบคำถามที่ถาม (แม้ว่าทั้งสองจะมีประโยชน์)
Alexx Roche

แต่คุณจะส่งอาร์กิวเมนต์ 'data' ไปยังสคริปต์ได้อย่างไรหากเป็นแบบหลายบรรทัด? เช่นเดียวกับร่างกาย xml หรือ json โดยไม่สูญเสียการเยื้อง
HyperioN

@HyperioN หากคุณมีข้อมูล json อยู่ในไฟล์คุณสามารถทำได้: hash_hmac "sha1" "$(cat your-json-file)" "key". หรือคุณสามารถไพพ์ไฟล์ของคุณผ่านopenssl dgstโดยไม่ต้องใช้hash_hmacฟังก์ชันนี้
Martin

ขอบคุณสำหรับ -binary bit นั่นคือชิ้นส่วนที่ขาดหายไปสำหรับฉัน
jgreen

9

ขอบคุณสำหรับฟังก์ชัน hash_hmac! แต่มันไม่เพียงพอสำหรับการสมัครของฉัน ในกรณีที่ใครสงสัยฉันต้องแฮชซ้ำหลาย ๆ ครั้งโดยใช้คีย์ที่เป็นผลมาจากการแฮชก่อนหน้านี้ดังนั้นจึงเป็นการป้อนข้อมูลไบนารี (ลายเซ็นการตรวจสอบสิทธิ์ Amazon AWS ถูกสร้างขึ้นเช่นนี้)

ดังนั้นสิ่งที่ฉันต้องการคือวิธีจัดหาคีย์ไบนารีในบางวิธีที่จะไม่ทำลายอัลกอริทึม จากนั้นฉันพบสิ่งนี้: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

การตอบกลับของ Stephen Henson ต้องการฟังก์ชัน hash_hmac เพื่อส่งคืนค่าในรูปแบบฐานสิบหก ดังนั้นจึงจำเป็นต้องสะท้อนสิ่งต่อไปนี้:

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

จากนั้นการโทรครั้งต่อไปจะต้องระบุคีย์เป็นเลขฐานสิบหก:

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

หวังว่าสิ่งนี้จะช่วยทุกคนอาจเป็นคนที่พยายามสร้างสคริปต์ทุบตีเพื่อทำให้รายการ CloudFront เป็นโมฆะบน AWS (เช่นฉัน!) (ฉันยังไม่ได้ทดสอบ แต่ฉันคิดว่านี่เป็นสาเหตุที่ทำให้สคริปต์ทุบตีของฉัน ใช้งานไม่ได้และ PHP ของฉันทำ ... )


0

การติดตั้ง node.js คุณสามารถใช้เครื่องมือHMAC-CLI :

npx hmac-cli generate 'value' -h sha1 -s key

ผลตอบแทน:

57443a4c052350a44638835d64fd66822f813319

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.