HMAC-SHA1 बैश में


95

HMAC-SHA1हैश उत्पन्न करने के लिए बैश स्क्रिप्ट है ?

मैं निम्नलिखित PHP कोड के बराबर कुछ खोज रहा हूँ:

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

जवाबों:


185

मुझे लगता है कि यह वही नहीं है जो आप पूछ रहे हैं, लेकिन पहिया को सुदृढ़ करने और बैश संस्करण लिखने का कोई मतलब नहीं है।

आप बस 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(जैसे कि RHEL4 के साथ शिप किए गए) -hmacविकल्प प्रदान नहीं कर सकते हैं ।


एक वैकल्पिक समाधान के रूप में, लेकिन मुख्य रूप से यह साबित करने के लिए कि परिणाम समान हैं, हम PHP hmac_sha1()को कमांड लाइन से भी कॉल कर सकते हैं :

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

ओपनएसएसएल कार्यान्वयन बहुत धीमा है। यदि आपको इसे कभी-कभार करने की आवश्यकता है, तो ठीक है, लेकिन यदि आप भारी मात्रा में हैश की गणना करने की कोशिश कर रहे हैं, तो आप विभिन्न राशियों की जांच करना चाहते हैं।
Marcin

1
@ मारकिन: क्या आप उस स्रोत को उद्धृत कर सकते हैं?
sehe

6
HMAC-SHA256 के साथ मेरा भी यही सवाल था। एक ही समाधान, लेकिन sha1इसे sha256:-)
मोग्सी

1
हां, आप कर सकते हैं, लेकिन अपनी फ़ाइल के भीतर लाइनब्रीक के लिए देखें क्योंकि इसे भी मूल्य का हिस्सा माना जाएगा।
शॉन चिन

1
@ShawnChin, इस उदाहरण में, कुंजी की एन्कोडिंग / प्रारूप क्या है? क्या इसका उपयोग कर बनाई गई एक निजी कुंजी की तरह एक बेस 64 एन्कोडिंग होना चाहिए openssl genrsa? इसके अलावा,
ओप्सनल

40

यहाँ एक बश फ़ंक्शन है जो hash_hmacPHP से काम करता है :

#!/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
शॉन चिन

+1 क्योंकि चयनित उत्तर के विपरीत, यह पूछे गए प्रश्न का उत्तर देता है। (हालांकि दोनों ही मददगार हैं।)
एलेक्स रॉश

लेकिन, यदि आप मल्टी लाइन है तो आप 'डेटा' तर्क को स्क्रिप्ट में कैसे पास करेंगे? इंडेंटेशन खोए बिना एक xml या json बॉडी की तरह।
हायपरियोएन

@HyperioN आप एक फ़ाइल में अपने json डेटा है तो आप बस ऐसा कर सकता है: hash_hmac "sha1" "$(cat your-json-file)" "key"। वैकल्पिक रूप से आप openssl dgstइस hash_hmacफ़ंक्शन का उपयोग किए बिना केवल अपनी फ़ाइल को पाइप कर सकते हैं ।
मार्टिन

9

Hash_hmac फ़ंक्शन के लिए धन्यवाद! लेकिन यह मेरे आवेदन के लिए पर्याप्त नहीं था। यदि किसी को आश्चर्य होता है, तो मुझे एक कुंजी का उपयोग करके कई बार सामान को फिर से हैश करना पड़ता है जो पिछले हैशिंग का परिणाम था, और इसलिए एक बाइनरी इनपुट है। (अमेज़ॅन AWS प्रमाणीकरण हस्ताक्षर इस तरह बनाया गया है)

तो मुझे जिस चीज की जरूरत थी, वह द्विआधारी कुंजी को किसी तरह से आपूर्ति करने का एक तरीका था जो कि एल्गोरिथ्म को नहीं तोड़ता। तब मुझे यह मिला: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

स्टीफन हेंसन के जवाब को हेक्स प्रारूप में मूल्य वापस करने के लिए 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/^.* //'

उम्मीद है कि यह किसी को भी मदद करता है, शायद कोई ऐसा व्यक्ति जो एडब्ल्यूएस पर क्लाउडफ्रंट प्रविष्टियों को अमान्य करने के लिए बैश स्क्रिप्ट बनाने की कोशिश कर रहा है (मेरे जैसे!) (मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यही वह चीज है जो मेरी बैश स्क्रिप्ट का कारण है। काम नहीं करता है, और मेरे PHP एक करता है ...)


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.