2011-12-20 9 views
13

मैं का उपयोग PBKDF2 का उपयोग करके कुंजी उत्पन्न करने के लिए CommonCrypto का उपयोग करने की कोशिश कर रहा हूं लेकिन मुझे CommonCrypto/CommonKeyDerivation.h आयात करने की प्रतीत नहीं होती है, मुझे बस त्रुटियां मिलती हैं जो यह नहीं मिलती है।आईओएस पर कॉमनक्रिप्टो का उपयोग करके पीबीकेडीएफ 2

कोई विचार?

संपादित करें: मुझे शायद उल्लेख करना चाहिए कि मैंने पहले से ही सुरक्षा ढांचे को जोड़ा है और मैं अन्य सभी CommonCrypto शीर्षलेख आयात कर सकता हूं।

उत्तर

32

यहाँ कैसे मैं AES256 कुंजी उत्पन्न है। एकमात्र दिलचस्प यह है कि मुझे आमक्रिप्टो का अनुमान लगाने के लिए मिलता है कि कितने राउंड का उपयोग करना है। यह बहुत सरल लगता है।

#import <CommonCrypto/CommonKeyDerivation.h> 

... 

// Makes a random 256-bit salt 
- (NSData*)generateSalt256 { 
    unsigned char salt[32]; 
    for (int i=0; i<32; i++) { 
     salt[i] = (unsigned char)arc4random(); 
    } 
    return [NSData dataWithBytes:salt length:32]; 
} 

... 

// Make keys! 
NSString* myPass = @"MyPassword1234"; 
NSData* myPassData = [myPass dataUsingEncoding:NSUTF8StringEncoding]; 
NSData* salt = [self generateSalt256]; 

// How many rounds to use so that it takes 0.1s ? 
int rounds = CCCalibratePBKDF(kCCPBKDF2, myPassData.length, salt.length, kCCPRFHmacAlgSHA256, 32, 100); 

// Open CommonKeyDerivation.h for help 
unsigned char key[32]; 
CCKeyDerivationPBKDF(kCCPBKDF2, myPassData.bytes, myPassData.length, salt.bytes, salt.length, kCCPRFHmacAlgSHA256, rounds, key, 32); 
+1

ध्यान रखें कि पीबीकेडीएफ अंशांकन ठीक हो सकता है यदि आपको केवल एक डिवाइस (या कम से कम उपकरणों के समान वर्ग) पर एक कुंजी प्राप्त करने की आवश्यकता है। जब आप उदा। डेटा को सिंक करने और विभिन्न उपकरणों पर एक ही कुंजी प्राप्त करने की आवश्यकता है, फिर यह कई राउंड सेट करने के लिए एक और समझदार दृष्टिकोण है जो सभी उपकरणों (जैसे मैक प्रो और आईफोन) पर दर्द रहित ढंग से काम करेगा। 2012 में 10000-20000 के बीच कुछ अच्छी संख्या होनी चाहिए। –

+6

क्रिप्टोग्राफी अनुप्रयोगों में छद्म-यादृच्छिक संख्या पीढ़ी के लिए SecRandomCopyBytes() का उपयोग करना बेहतर है। - अन्यथा, महान कोड! मुझे पीबीकेडीएफ 2 राउंड अनुमान बिट पसंद है =) –

+0

लंबाई 32 बाइट्स का नमक बनाना आवश्यक है? –

1

क्या आप आईओएस 5 के लिए निर्माण कर रहे हैं? या पुराने संस्करण?

हेडर फ़ाइल में परिभाषित एपीआई, CCKeyDerivationPBKDF और CCCalibratePBKDF दोनों, केवल आईओएस 5 (या ओएसएक्स 10.7) और बाद में उपलब्ध हैं।

आप सुनिश्चित करें कि फ़ाइल एक टर्मिनल विंडो के अंदर इस क्रियान्वित करते हुए मौजूद कर सकते हैं:

$ find /Developer/ -name CommonKeyDerivation.h 
/Developer//Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/CommonCrypto/CommonKeyDerivation.h 
/Developer//Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/usr/include/CommonCrypto/CommonKeyDerivation.h 
/Developer//SDKs/MacOSX10.7.sdk/usr/include/CommonCrypto/CommonKeyDerivation.h 
+0

आईओएस 4 दुर्भाग्य से। मान लीजिए कि मैं एक वैकल्पिक कार्यान्वयन की तलाश करूंगा। – AnthonyM

6
  1. हैश कुंजी पीढ़ी वर्ग में libcommonCrypto.dylib
  2. #import अपनी परियोजना के लिए इस पुस्तकालय जोड़ें।
  3. हैश कुंजी उत्पन्न करने के लिए निम्न कोड का उपयोग करें।

इस कोड को मैं क्या इस्तेमाल किया है है:

// Salt data getting from salt string. 
NSData *saltData = [@"Salt String" dataUsingEncoding:NSUTF8StringEncoding]; 

// Data of String to generate Hash key(hexa decimal string). 
NSData *passwordData = [@"Hash key generated string" dataUsingEncoding:NSUTF8StringEncoding]; 

// Hash key (hexa decimal) string data length. 
NSMutableData *hashKeyData = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH]; 

// Key Derivation using PBKDF2 algorithm. 
int result = CCKeyDerivationPBKDF(kCCPBKDF2, passwordData.bytes, passwordData.length, saltData.bytes, saltData.length, kCCPRFHmacAlgSHA1, 1000, hashKeyData.mutableBytes, hashKeyData.length); 

// Hexa decimal or hash key string from hash key data. 
NSString *hexDecimalString = hashKeyData.description; 

NSLog(@"Hexa decimal string:%@", hexDecimalString); 
+0

बिल्कुल, अच्छी तरह से किया गया। – magichero

+0

ग्रेट, बस अपडेट करें। आपको ISO8 – kraag22

+0

में प्रोजेक्ट के लिए libcommonCrypto.dylib जोड़ने की आवश्यकता नहीं है बहुत अच्छा कोड। –

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