2008-12-12 12 views
5

मैं, उद्देश्य सीएचएमएसी SHA-1 एक ही इनपुट के साथ एक अलग डाइजेस्ट क्यों करेगा?

का उपयोग कर एक कनेक्शन पुस्तकालय लिख रहा HMAC SHA-1 में चलाने की है ObjC कोड के साथ समस्याओं को पचाने अमेज़न S3 वेब सेवा के लिए एक काम कर एन्क्रिप्टेड हस्ताक्षर का निर्माण करने की कोशिश कर रहा हूँ, इसलिए मैं डाल रहा हूं कि पक्ष के लिए और मौजूदा, देख रहे पर्ल कोड, पाचन निर्माण की समस्या निवारण करने का प्रयास करने के लिए।

मैं HMAC SHA-1 Net::Amazon::S3 पैकेज के s3ls आदेश से उत्पादन को पचाने का परीक्षण कर रहा हूँ और की तुलना कि _encode सबरूटीन है कि मैं बाहर निकाला और अपने स्वयं के पर्ल स्क्रिप्ट में डाल के खिलाफ:

#!/usr/bin/perl -w                                              

use MIME::Base64 qw(encode_base64); 
use Digest::HMAC_SHA1; 
use String::Escape qw(printable unprintable); 

sub _ascii_to_hex { 
    (my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg; 
    return $str; 
} 

sub _encode { 
    my ($aws_secret_access_key, $str) = @_; 
    print "secret key hex: "._ascii_to_hex($aws_secret_access_key)."\n"; 
    my $hmac = Digest::HMAC_SHA1->new($aws_secret_access_key); 
    $hmac->add($str); 
    my $digest = $hmac->digest; 
    print "cleartext hex: "._ascii_to_hex($str)."\n"; 
    print "digest hex: "._ascii_to_hex($digest)."\n"; 
    my $b64 = encode_base64($digest, ''); 
    print "encoded: ".$b64."\n"; 
} 

my $secret = "abcd1234"; 
my $cleartext = "GET\n\n\nFri, 12 Dec 2008 10:08:51 GMT+00:00\n/"; 
_encode($secret, $cleartext); 

यहाँ नमूना है इस स्क्रिप्ट से उत्पादन:

$ ./testhmac.pl 
secret key hex: 6162636431323334 
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f 
digest hex: 63308f9b8a198440d6d8685a3f3f70d0aab02f68 
encoded: YzCPm4oZhEDW2GhaPz9w0KqwL2g= 

क्या मैं परीक्षण कर रहा हूँ कि, अगर मैं इनपुटका एक ही _encode समारोह में एक ही गुप्त कुंजी और क्लियरपैकेज, मुझे एक ही गुप्त कुंजी, क्लीयरक्स्ट, और डाइजेस्ट बाइट्स देखना चाहिए।

दरअसल, मुझे गुप्त कुंजी और क्लीयरक्स्ट के लिए समान बाइट मिलते हैं।

लेकिन मैं कुछ डाइजेस्ट के लिए अलग (और निश्चित रूप से बेस 64 एन्कोडिंग) मिलता है, उदा .:

$ s3ls --access-key=foobar --secret-key=abcd1234 
... 
secret key hex: 6162636431323334 
cleartext hex: 4745540a0a0a4672692c2031322044656320323030382031303a30383a353120474d542b30303a30300a2f 
digest hex: c0da50050c451847de7ed055c5286de584527a22 
encoded: wNpQBQxFGEfeftBVxSht5YRSeiI= 

मैं सत्यापित किया है कि गुप्त कुंजी और स्पष्ट पाठ दोनों लिपियों के लिए एक ही इनपुट कर रहे हैं। एन्कोडिंग सबराउटिन दोनों स्क्रिप्ट्स में लगभग समान है (subroutine को पारित एक अप्रयुक्त तर्क को छोड़कर, जिसे मैं अपने कस्टम संस्करण से हटाता हूं)।

इनपुट बाइट्स और _encode सबराउटिन समान हैं, तो दोनों मामलों में एचएमएसी SHA-1 पाचन की गणना अलग-अलग क्यों की जाएगी?

(मैं भी RFC 2201 पर परीक्षण मामलों के खिलाफ दो लिपियों सत्यापित किया है।)

उत्तर

3

मैं मुख्य समस्याओं में मैं तुलना में हैश के साथ पड़ा है लगता है कर रहे हैं:

  1. डेटा को सुनिश्चित करने और कुंजी दोनों तुलना
  2. डेटा और चाबी सुनिश्चित में ही कर रहे हैं एक ही वर्ण एन्कोडिंग में हैं दोनों तुलनाओं में
  3. सुनिश्चित करें कि कुंजी और टेक्स्ट दोनों स्क्रिप्ट्स में समान रूप से पारित किए जा रहे हैं, यानी कौन सा कुंजी है और कौन सा पाठ है (इसने मुझे एक से अधिक बार पकड़ा है)।

आपके लिए हैश बनाने और इसके परिणामों के साथ तुलना करने के लिए डाइजेस्ट :: SHA मॉड्यूल का उपयोग करने का प्रयास करें।

use Digest::SHA qw(hmac_sha1_hex); 
my $hash = hmac_sha1_hex($data, $key); 

पर http://perldoc.perl.org/Digest/SHA.pdf

+0

1. डेटा ("स्पष्ट पाठ") और कुंजी ("गुप्त कुंजी"), 2. मैं दोनों ही मामलों 3. _ascii_to_hex परिणाम बताते हैं के रूप में में UTF8 तार का उपयोग कर रहा दोनों की तुलना में एक ही हैं बाइट्स गुप्त कुंजी और एचएमएसी इंस्टेंस में इनपुट के रूप में उपयोग किए जाने वाले स्पष्ट टेक्स्ट के लिए समान हैं, शायद एक अलग पर्ल मॉड्यूल मदद करेगा। –

+0

AFAIK, Digest :: HMAC_SHA1 आंतरिक रूप से डाइजेस्ट :: SHA का उपयोग करता है। – innaM

1

मुझे डर है कि मैं बहुत यहाँ मदद नहीं कर सकता हूँ, लेकिन वहाँ निश्चित रूप से कुछ गलत क्या आप पोस्ट के साथ है। आपकी उदाहरण स्क्रिप्ट मेरे लिए अलग-अलग आउटपुट उत्पन्न करती है और आपके द्वारा पोस्ट किया गया आउटपुट वास्तव में सही नहीं हो सकता है।

यह कैसे

secret key hex: abcd...1234 

कभी उस

_ascii_to_hex("blahblahblah") 

बेशक का परिणाम हो सकता है, पूरे ascii_to_hex बात पूरी तरह से आपकी समस्या के लिए अप्रासंगिक है, लेकिन यह पता चलता है कि आप करना चाहिए फिर से जांच आपके परिणाम

1

फूट डालो डॉक्स देखें और जीत?

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

एक तरफ आपकी मदद करने में वास्तव में मुश्किल है जब आपका उदाहरण बकवास है। जैसा कि दूसरों ने बताया कि ब्ला ब्ला का हेक्स प्रतिनिधित्व abc..123 नहीं है। मुझे आश्चर्य है कि आपके उदाहरण में और क्या गलत है?

2

एन्कोडिंग सबराउटिन दोनों स्क्रिप्ट्स में लगभग समान है (subroutine को पारित एक अप्रयुक्त तर्क को छोड़कर, जिसे मैं अपने कस्टम संस्करण से हटाता हूं)।

चूंकि आप खुद को डाइजेस्ट की तुलना नहीं कर रहे हैं, लेकिन डाइजेस्ट के बेस -64 एन्कोडेड संस्करण, मैं एक कदम का बैक अप लेने और खुद को डाइजेस्ट की जांच करने की सलाह दूंगा। यह संभव हो सकता है कि बेस -64 एन्कोडिंग दिनचर्या गलत हैं।

यदि आप खुद को digests की तुलना नहीं कर सकते हैं, तो दोनों प्रोग्रामों में एक ही एन्कोडिंग दिनचर्या का उपयोग करें और देखें कि आपको क्या मिलता है।

संबंधित मुद्दे