2011-06-03 8 views
54

सुरक्षा सेवा API मुझे एक हैश की गणना करने की अनुमति देने के लिए प्रकट नहीं होता है। बहुत सारे सार्वजनिक डोमेन और उदार लाइसेंस प्राप्त संस्करण उपलब्ध हैं, लेकिन यदि संभव हो तो मैं सिस्टम लाइब्रेरी कार्यान्वयन का उपयोग करूंगा।आईओएस में मैं SHA-2 (आदर्श SHA 256 या SHA 512) हैश की गणना कैसे कर सकता हूं?

डेटा NSData, या सादे संकेत के माध्यम से सुलभ है।

हैश के क्रिप्टोग्राफिक शक्ति मेरे लिए महत्वपूर्ण है। एसएचए -256 न्यूनतम स्वीकार्य हैश आकार है।

उत्तर

78

यह है कि मैं क्या SHA1 के लिए उपयोग कर रहा हूँ है:

+ (NSData *)sha1:(NSData *)data { 
    unsigned char hash[CC_SHA1_DIGEST_LENGTH]; 
    if (CC_SHA1([data bytes], [data length], hash)) { 
     NSData *sha1 = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];   
     return sha1; 
    } 
return nil; 
} 

CC_SHA256_DIGEST_LENGTH साथ CC_SHA256 साथ CC_SHA1 (या जो भी आप की जरूरत), और साथ ही CC_SHA1_DIGEST_LENGTH बदलें।

आप यहाँ एक बहुत समान NSString के आधार पर एक है #import <CommonCrypto/CommonDigest.h>

+2

आयात, मुझे बचाया धन्यवाद! – 1789040

+0

यह काम नहीं किया .. लौटाए गए डेटा को एनएसएसटींग में परिवर्तित करने के लिए मेरे लिए शून्य वापस आ गया। यदि मैंने डेटा में पास किया है तो नीचे दिया गया पोस्ट "हैश_स्ट्रिंग" काम करता है। – TheJeff

+0

@TheJeff - प्रश्न SHA मान को हेक्साडेसिमल स्ट्रिंग के रूप में वापस करने के बारे में कुछ भी नहीं कहता है। 'NSData' को 'NSString' में कनवर्ट करना अपने आप पर एक अलग प्रश्न हो सकता है। –

31

की जरूरत

+ (NSString *)hashed_string:(NSString *)input 
{ 
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstr length:input.length]; 
    uint8_t digest[CC_SHA256_DIGEST_LENGTH]; 

    // This is an iOS5-specific method. 
    // It takes in the data, how much data, and then output format, which in this case is an int array. 
    CC_SHA256(data.bytes, data.length, digest); 

    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; 

    // Parse through the CC_SHA256 results (stored inside of digest[]). 
    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { 
     [output appendFormat:@"%02x", digest[i]]; 
    } 

    return output; 
} 

(क्रेडिट http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1 करने के लिए जाना)

+4

डेटा को डालने के लिए। Length: CC_SHA256 (data.bytes, (int) डेटा। लम्बाई, पचाना); – RyanG

+0

डेटा होना चाहिए [एनएसडीएटा डेटाविथबाइट्स: सीएसटी लंबाई: स्ट्रेल (सीएसटी)]; ' '[इनपुट डेटा यूजिंग एन्कोडिंग: एनएसयूटीएफ 8 स्टिंगएन्कोडिंग] का उपयोग करना बेहतर होगा;' – mikeytdan

3

यह वही मुझे

func sha256(securityString : String) -> String { 
    let data = securityString.dataUsingEncoding(NSUTF8StringEncoding)! 
    var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0) 
    CC_SHA256(data.bytes, CC_LONG(data.length), &hash) 
    let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH)) 
    for byte in hash { 
     output.appendFormat("%02x", byte) 
    } 
    return output as String 
} 
0

के लिए काम किया है लिंक के नीचे मैं दस्तावेज़ हैश बनाम बनाने के लिए प्रयोग किया जाता है अल्यू और विशेष रूप से बड़ी फ़ाइलों के लिए हैश मान की गणना करना बहुत आसान और आसान है।

लिंक: http://www.joel.lopes-da-silva.com/2010/09/07/compute-md5-or-sha-hash-of-large-file-efficiently-on-ios-and-mac-os-x/comment-page-1/#comment-18533

0
+ (NSData *)sha256DataFromData:(NSData *)data { 
    unsigned char result[CC_SHA256_DIGEST_LENGTH]; 
    CC_SHA256([data bytes], (int)[data length], result); 
    return [NSData dataWithBytes:result length:CC_SHA256_DIGEST_LENGTH]; 
} 
संबंधित मुद्दे