bash बाश में एचएमएसी-एसएचए 1




sha1 hmac (4)

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

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

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

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

#!/bin/bash

function hash_hmac {
  digest="$1"
  data="$2"
  key="$3"
  shift 3
  echo -n "$data" | openssl dgst "-$digest" -hmac "$key" "[email protected]"
}

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


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

आप अपनी स्क्रिप्ट के भीतर हैश उत्पन्न करने के लिए openssl कमांड का उपयोग कर सकते हैं।

[[email protected]] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

या केवल:

[[email protected]] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

echo साथ -n साथ उपयोग करना याद रखें या फिर एक लाइन ब्रेक वर्ण स्ट्रिंग में जोड़ा गया है और यह आपके डेटा और हैश को बदलता है।

वह आदेश ओपनएसएसएल पैकेज से आता है जो कि लिनक्स / यूनिक्स, सिगविन और पसंदों की आपकी पसंद में पहले ही इंस्टॉल किया जा सकता है (या आसानी से इंस्टॉल किया जाना चाहिए)।

ध्यान दें कि openssl पुराने संस्करण (जैसे कि RHEL4 के साथ भेजा गया) -hmac विकल्प प्रदान नहीं कर सकता है।

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

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

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

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

स्टीफन हेन्सन के जवाब में हैश_हैम फ़ंक्शन को हेक्स प्रारूप में मान वापस करने की आवश्यकता है। तो इसे निम्नलिखित गूंजने की जरूरत है:

$ 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 एक करता है ...)





hmac