2011-12-20 36 views
13

Tôi đang cố gắng sử dụng CommonCrypto để tạo khóa bằng cách sử dụng PBKDF2 nhưng dường như tôi không nhập được CommonCrypto/CommonKeyDerivation.h, tôi chỉ gặp lỗi mà không tìm thấy.PBKDF2 sử dụng CommonCrypto trên iOS

Bất kỳ ý tưởng nào?

chỉnh sửa: Tôi có lẽ nên đề cập đến tôi đã thêm khung bảo mật và tôi có thể nhập tất cả các tiêu đề khác CommonCrypto.

Trả lời

32

Dưới đây là làm thế nào tôi tạo ra các phím AES256. Điều thú vị duy nhất là tôi nhận được CommonCrypto để ước tính cho tôi có bao nhiêu viên đạn để sử dụng. Nó có vẻ khá đơn giản.

#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

Hãy nhớ rằng hiệu chuẩn PBKDF có thể là OK nếu bạn chỉ cần lấy một khóa trên một thiết bị (hoặc ít nhất là cùng một loại thiết bị). Khi bạn, ví dụ: cần phải đồng bộ hóa dữ liệu và lấy cùng một khóa trên các thiết bị khác nhau, thì đó là một cách tiếp cận hợp lý hơn để đặt số vòng sẽ hoạt động không đau trên tất cả các thiết bị (ví dụ: Mac Pro & iPhone). Một cái gì đó giữa 10000-20000 nên là một con số tốt trong năm 2012. –

+6

Tốt hơn nên sử dụng SecRandomCopyBytes() để tạo số giả ngẫu nhiên trong các ứng dụng mã hóa. - Nếu không, mã tuyệt vời! Tôi thích bit ước lượng vòng PBKDF2 =) –

+0

Có cần thiết để tạo ra một muối có độ dài 32 byte không? –

1

Bạn đang xây dựng cho iOS5? hoặc phiên bản cũ hơn?

Cả API, CCKeyDerivationPBKDFCCCalibratePBKDF, được xác định trong tệp tiêu đề chỉ có sẵn trên IOS5 (hoặc OSX 10.7) trở lên.

Bạn có thể chắc chắn rằng các tập tin tồn tại bằng cách thực hiện này bên trong một cửa sổ terminal:

$ 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

iOS 4 không may. Đoán tôi sẽ tìm kiếm một thực hiện thay thế sau đó. – AnthonyM

6
  1. Thêm thư viện này để dự án của bạn libcommonCrypto.dylib
  2. #import vào băm lớp thế hệ then chốt.
  3. sử dụng mã sau để tạo khóa băm.

Đây là mã những gì tôi đã được sử dụng:

// 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

Chính xác, được thực hiện tốt. – magichero

+0

Tuyệt vời, chỉ cần cập nhật. Bạn không cần phải thêm libcommonCrypto.dylib vào dự án trong iOS8 – kraag22

+0

Mã rất đẹp. –