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


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

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

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

76
2017-09-02 14:36


मूल




जवाब:


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

आप बस इसका उपयोग कर सकते हैं 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 (जैसे कि आरएचईएल 4 के साथ भेजा गया) प्रदान नहीं कर सकता है -hmac विकल्प।


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

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

147
2017-09-02 14:52



ओपनएसएसएल कार्यान्वयन बहुत धीमी हैं। यदि आपको कभी-कभी ऐसा करने की ज़रूरत है तो यह ठीक है, लेकिन यदि आप भारी मात्रा में हैश की गणना करने की कोशिश कर रहे हैं, तो आप विभिन्न तरीकों की जांच करना चाहते हैं। - Marcin
@ मार्सिन: क्या आप इसके साथ एक स्रोत उद्धृत कर सकते हैं? - sehe
मेरे पास एचएमएसी-एसएचए 256 के साथ एक ही सवाल था। वही समाधान, लेकिन sha1 के साथ प्रतिस्थापित किया गया है sha256 :-) - mogsie
हां आप कर सकते हैं, लेकिन अपनी फ़ाइल के भीतर लाइनब्रेक्स के लिए देखें क्योंकि इसे मूल्य का हिस्सा भी माना जाएगा। - Shawn Chin
@ShawnChin, इस उदाहरण में, कुंजी के एन्कोडिंग / प्रारूप क्या है? क्या यह बेस 64 एन्कोडिंग होना चाहिए जैसे कि इस्तेमाल की गई निजी कुंजी openssl genrsa? इसके अलावा, openssl प्रलेखन लिंक 404 में परिणाम। - Carlos Macasaet


यहां एक बैश फ़ंक्शन है जो काम करता है 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"

32
2017-09-12 08:36



इसे लपेटने का यह एक अच्छा तरीका है। +1 - Shawn Chin
बाइनरी के लिए धन्यवाद :) - Manav
+1 क्योंकि चयनित उत्तर के विपरीत, यह पूछे गए प्रश्न का उत्तर देता है। (हालांकि दोनों सहायक हैं।) - Alexx Roche
@ मार्क यह स्वीकार्य उत्तर होना चाहिए। - Yokai
लेकिन, यदि आप बहु रेखा हैं तो आप स्क्रिप्ट को 'डेटा' तर्क कैसे पास करते हैं? इंडेंटेशन को खोए बिना एक्सएमएल या जेसन बॉडी की तरह। - HyperioN


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


3
2018-03-13 05:13





उन लोगों के लिए जो कमांड लाइन पर अधिक जेडब्ल्यूटी तलाशना पसंद करते हैं: शांत jwt bash स्क्रिप्ट


0
2018-02-07 23:04