मैं, उद्देश्य सीएचएमएसी 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 पर परीक्षण मामलों के खिलाफ दो लिपियों सत्यापित किया है।)
1. डेटा ("स्पष्ट पाठ") और कुंजी ("गुप्त कुंजी"), 2. मैं दोनों ही मामलों 3. _ascii_to_hex परिणाम बताते हैं के रूप में में UTF8 तार का उपयोग कर रहा दोनों की तुलना में एक ही हैं बाइट्स गुप्त कुंजी और एचएमएसी इंस्टेंस में इनपुट के रूप में उपयोग किए जाने वाले स्पष्ट टेक्स्ट के लिए समान हैं, शायद एक अलग पर्ल मॉड्यूल मदद करेगा। –
AFAIK, Digest :: HMAC_SHA1 आंतरिक रूप से डाइजेस्ट :: SHA का उपयोग करता है। – innaM