2009-03-27 8 views
14

मेरे पास कोको ऐप एक डेटा ऐप के SHA1 हैश के साथ कुछ डेटा भेजता है जो डेटा और हैश मैच को सत्यापित करता है, लेकिन वे नहीं करते हैं।SHA1 हैश मेरे रेल और कोको ऐप्स के बीच मेल नहीं खाता

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

#import <CommonCrypto/CommonDigest.h> 

//... 

- (NSData *)dataOfSHA1Hash 
{ 
    unsigned char hashBytes[CC_SHA1_DIGEST_LENGTH]; 
    CC_SHA1([self bytes], CC_SHA1_DIGEST_LENGTH, hashBytes); 

    return [NSData dataWithBytes:hashBytes length:CC_SHA1_DIGEST_LENGTH]; 
} 

//... 

NSData *signatureData = [signedData dataOfSHA1Hash]; 
NSString *signature = [signatureData hexadecimalString]; 

..और रेल:

यहाँ कोको हिस्सा है

Digest::SHA1.hexdigest(signed_data) 

ध्यान दें कि -hexadecimalString NSData के लिए एक कस्टम विस्तार है (में निर्मित किया जाना नहीं मालूम था) है, जो मैंने परीक्षण किया है वह विधि समस्या प्रतीत नहीं होती है।

तो, मेरे SHA1 हैश एक ही डेटा पर क्यों नहीं मिलते हैं? कोई विचार?

संपादित करें: उदाहरण

स्ट्रिंग के लिए "नमस्ते दुनिया!"

Cocoa: f98ee9c814c2f3c66ccdca641298d12cd26741ec 
Rails: 2ef7bde608ce5404e97d5f042f95f89f1c232871

कोको:

NSMutableData *signedData = [[NSMutableData alloc] init]; 
[signedData appendData:[@"Hello World!" dataUsingEncoding:NSUTF8StringEncoding]]; 

NSData *signatureData = [signedData dataOfSHA1Hash]; 
[signedData release]; 
NSString *signature = [signatureData hexadecimalString]; 

NSLog(@"Signature: %@", signature); 
// output: Signature: f98ee9c814c2f3c66ccdca641298d12cd26741ec 

रूबी:

>> Digest::SHA1.hexdigest("Hello World!") 
=> "2ef7bde608ce5404e97d5f042f95f89f1c232871" 
+0

क्या आप नमूना डेटाम और डाइजेस्ट पोस्ट कर सकते हैं ताकि हम देख सकें कि कौन सा गलत है? – cobbal

+2

एफडब्ल्यूआईडब्ल्यू - मैंने अभी अपने आईफोन ऐप में एक ही समस्या की खोज की है। CC_SHA1 उसी हैश को वापस नहीं कर रहा था क्योंकि पाइथन hashlib.sha1 सामान करता है। मेरे पास समान गलत-लंबाई-गुजरने वाला मुद्दा नहीं था क्योंकि sjmulder ने किया था, जो इस तथ्य से साबित हुआ था कि CC_SHA1() के बजाय ओपनएसएसएल SHA1() कार्यान्वयन का उपयोग करने के लिए बस बदलना वास्तव में इसे ठीक करता है। तर्क या कुछ भी नहीं बदला, बस मैंने जिस फ़ंक्शन को हैश की गणना करने के लिए बुलाया था। बहुत अजीब और चिंताजनक है कि CC_SHA1() छोटी गाड़ी प्रतीत होता है। – glenc

+0

मेरे पास एक समान बग था, हालांकि मेरे मामले में मैं डेटा संकेतक को 'CC_SHA1'' के पहले तर्क के लिए उपयोग कर रहा था। मुझे '[डेटा बाइट्स] 'का उपयोग करना चाहिए था। इसे समझने में एक शर्मनाक समय लगा। –

उत्तर

8

मिला त्रुटि, बेवकूफ छोटी बात:

-CC_SHA1([self bytes], CC_SHA1_DIGEST_LENGTH, hashBytes); 
+CC_SHA1([self bytes], [self length], hashBytes); 

मैं के बजाय डाइजेस्ट की लंबाई भेजा डेटा की लंबाई। यह नहीं पता कि मैं ऐसी गलती कैसे कर सकता था - और फिर घंटों तक इसे नजरअंदाज कर दें।

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