एचएमएसी-एसएचए 1 बाश


67

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

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

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

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

आप बस 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 पैकेज जो पहले से ही लिनक्स/यूनिक्स, Cygwin और पसंद के अपनी पसंद में स्थापित किया जाना चाहिए (या आसानी से स्थापित) से आता है।

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

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

ओपनएसएसएल कार्यान्वयन बहुत धीमी हैं।यदि आपको कभी-कभी ऐसा करने की ज़रूरत है तो यह ठीक है, लेकिन यदि आप भारी मात्रा में हैश की गणना करने की कोशिश कर रहे हैं, तो आप विभिन्न तरीकों की जांच करना चाहते हैं। 02 sep. 112011-09-02 16:08:44

+1

@ मार्सिन: क्या आप इसके साथ एक स्रोत उद्धृत कर सकते हैं? 12 sep. 112011-09-12 08:49:50

  0

[जॉन द रिपर] (http://www.openwall.com/john/) सीपीयू कार्यान्वयन के लिए बहुत तेज़ है और यह ओपन सोर्स है। 12 sep. 112011-09-12 22:19:23

+4

मेरे पास एचएमएसी-एसएचए 256 के साथ एक ही सवाल था। वही समाधान, लेकिन 'sha1' को 'sha256' के साथ प्रतिस्थापित किया गया है :-) 26 jan. 122012-01-26 14:18:32

  0

यदि मेरे पास फ़ाइल में' मान" है, तो क्या मैं बस कर सकता हूं: 'cat signature.txt | openssl sha1 -hmac "कुंजी" '? 19 apr. 132013-04-19 12:08:58

+1

हां आप कर सकते हैं, लेकिन अपनी फ़ाइल के भीतर लाइनब्रेक्स के लिए देखें क्योंकि इसे मूल्य का हिस्सा भी माना जाएगा। 19 apr. 132013-04-19 12:57:17

+1

@ShawnChin, इस उदाहरण में, कुंजी के एन्कोडिंग/प्रारूप क्या है? क्या यह 'openssl genrsa' का उपयोग करके बनाए गए निजी कुंजी की तरह बेस 64 एन्कोडिंग होना चाहिए? इसके अलावा, openssl प्रलेखन लिंक 404 में परिणाम देता है। 18 aug. 152015-08-18 05:07:00

  0

openssl को कुंजी कैसे पास करें जब "कुंजी" एक बाइनरी सरणी है जिसमें विशेष वर्ण होता है? 05 oct. 162016-10-05 11:21:05

  0

आपकी पोस्ट के लिए धन्यवाद। अंत में उस अतिरिक्त लाइन ब्रेक ने मुझे थोड़ी देर के लिए जा रहा था। 30 oct. 162016-10-30 11:22:59

  0

'echo -n' का उपयोग न करें। यह पोर्टेबल नहीं है। इसके बजाय printf का प्रयोग करें। 09 mar. 182018-03-09 14:01:28


30

यहाँ एक पार्टी समारोह है कि hash_hmac की तरह काम करता है:


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

#!/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" 
  0

इसे लपेटने का यह एक अच्छा तरीका है। +1 12 sep. 112011-09-12 09:34:41

+2

बाइनरी के लिए धन्यवाद :) 07 sep. 122012-09-07 12:19:07

  0

+1 क्योंकि चयनित उत्तर के विपरीत, यह एक प्रश्न पूछा गया है। (हालांकि दोनों सहायक हैं।) 22 jun. 132013-06-22 13:30:05


2

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

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

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

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

उम्मीद है कि इस मदद करता है किसी को भी, शायद कोई है जो bash स्क्रिप्ट बनाने के लिए कोशिश कर रहा है:

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

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


0

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