परिदृश्य यह है कि मेरे पास एक जेएस स्क्रिप्ट है जो उपयोगकर्ता द्वारा प्रदान किए गए इनपुट के लिए एचएमएसी बनाता है और मैं उसी एचएमएसी को उसी इनपुट के लिए पाइथन का उपयोग करके गणना करना चाहता हूं। चीजों को स्पष्ट करने के लिए, निम्नलिखित जेएस और पायथन कोड स्निपेट पर विचार करें।

जावास्क्रिप्ट

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/hmac-sha256.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/enc-base64.min.js"></script>

<script>
    var secretAccessKey = "bAvW5O18eSrxke4I7eFcrnrDJkN+wKQmx9aSHuMZQ0w=";
    var stringtoSign = "Test";

    // Generate HMAC SHA256 signature
    var secretAccessKeyBase64 = CryptoJS.enc.Base64.parse(secretAccessKey);
    var hash = CryptoJS.HmacSHA256(stringtoSign, secretAccessKeyBase64);
    var signature = CryptoJS.enc.Base64.stringify(hash);
</script>

पायथन

stringToSign = "Test"
secretAccessKey = "bAvW5O18eSrxke4I7eFcrnrDJkN+wKQmx9aSHuMZQ0w="

secretAccessKeyBase64 = base64.b64decode(secretAccessKey).hex()
keyBytes = bytes(secretAccessKeyBase64, 'utf-8')
stringToSignBytes = bytes(stringToSign, 'utf-8')
signatureHash = hmac.new(keyBytes, stringToSignBytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(signatureHash)
print(signature)

Javascript कोड मुझे b+1wRzDODA85vyDZkXByPIKO5qmnjCRNF5gZFi33/Ic= देता है, जबकि पायथन मुझे b'SsZ4bcYe3op1nGU6bySzlSc9kgg9Kgp37qzF15s2zNc=' का मान देता है।

मेरा पायथन कोड जेएस स्क्रिप्ट को प्रदान किए गए समान इनपुट (प्रतीत होता है) के लिए एक अलग एचएमएसी क्यों उत्पन्न कर रहा है? क्या पाइथन का उपयोग कर जेएस कोड द्वारा आउटपुट एचएमएसी मूल्य प्राप्त करने के लिए वैसे भी है?

0
JohnnyHunter 23 जिंदा 2019, 01:49

1 उत्तर

सबसे बढ़िया उत्तर

आप जावास्क्रिप्ट में बेस 64 एन्कोडेड मान को गुप्त के रूप में उपयोग कर रहे हैं, जबकि पायथन में आप सादा पाठ रहस्य का उपयोग करते हैं।

<script>
    var secretAccessKeyBase64 = "secret";
    var hash = CryptoJS.HmacSHA256("Message", secretAccessKeyBase64);
    var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
    document.write(hashInBase64);
</script>

यह पायथन कोड के समान मान को प्रिंट करता है:

qnR8UCqJggD55PohusaBNviGoOJ67HC6Btry4qXLVZc=

संपादित करें:

बेस 64 एक बाइट-ऑब्जेक्ट देता है, इसे hex() में बदलने की कोई आवश्यकता नहीं है:

stringToSign = "Test"
secretAccessKey = "bAvW5O18eSrxke4I7eFcrnrDJkN+wKQmx9aSHuMZQ0w="

secretAccessKeyBase64 = base64.b64decode(secretAccessKey)
keyBytes = secretAccessKeyBase64
stringToSignBytes = bytes(stringToSign, 'utf-8')

signatureHash = hmac.new(keyBytes, stringToSignBytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(signatureHash)
print(signature)

सही ढंग से प्रिंट करता है:

b'b+1wRzDODA85vyDZkXByPIKO5qmnjCRNF5gZFi33/Ic='
1
Maurice Meyer 23 जिंदा 2019, 16:54