2011-01-17 34 views
11

Làm thế nào để tạo ra một SHA256 của một String trong iphone/Mục tiêu c ...Tạo SHA256 trong iphone/Objective C ...?

Sha256 in Objective-C for iPhone

Tôi đã đọc this..but tôi không thể hiểu được điều này ..

Tôi muốn tạo đầu ra tương tự như php funcation như sau: -

$hash = hash_hmac("sha256", implode(';', $hash_parameters), $api_key); 

nơi thông số hash là mảng các đối số ...

Bạn có thể viết nó như một phương thức sẽ lấy chuỗi đầu vào ...?

Và đầu ra của phương thức NSData hoặc NSString là gì .. ??

Tôi phải tạo yêu cầu với điều này .. ??

Vì vậy, trong các đối tượng yêu cầu ..

[theRequest setHTTPBody:requestBody]; 

gì nên là loại requestBody ??

+0

này rõ ràng đã được trả lời ở đây,> http://stackoverflow.com/questions/3709204/sha256-in-objective-c-for- iphone/11426583 # 11426583 – Jagadeeshwar

Trả lời

17

Tôi không chắc tôi hoàn toàn hiểu câu hỏi của bạn nhưng nếu bạn đang tìm cách tạo chuỗi băm bạn CÓ THỂ chuyển các tham số của bạn làm đối số cho hàm băm.

-(void)generateHashedString { 

    NSString *key = @"Some random string"; 
    //enter your objects you want to encode in the data object 
    NSString *data = [NSString stringWithFormat:@"%@%@%@", @"sha256", hash_parameters, api_key]; 

    const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; 
    const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding]; 

    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; 

    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); 

    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC 
              length:sizeof(cHMAC)]; 

    NSString *hash = [HMAC base64Encoding]; 

} 

Điều này sẽ cung cấp cho bạn NSString băm mà bạn có thể sử dụng để thực hiện yêu cầu của mình. NSLog(@"%@",hash); Để xem những gì bạn đã tạo!

Hãy chắc chắn rằng bạn #import <CommonCrypto/CommonHMAC.h> quá

+0

Tôi đã thử điều này, nhưng đầu ra khác với chức năng php – Maysam

+0

Đây là mã hóa base64.Bạn có thể bỏ qua mã hóa base64 nếu bạn không cần nó. – TALLBOY

+0

sau đó làm thế nào tôi có thể chuyển đổi hmac thành kiểu nsstring? – Maysam

2

tôi dành một ngày lỗ, cố gắng để chuyển đổi các hash được tạo ra (byte) thành dữ liệu có thể đọc được. Tôi đã sử dụng base64 được mã hóa như câu trả lời ở trên và nó không làm việc gì cả cho tôi (b.t.w. bạn cần và bên ngoài .h để có thể sử dụng mã hóa base64, mà tôi đã có).

Vì vậy, những gì tôi đã làm được điều này (trong đó hoạt động hoàn hảo mà không có một .h bên ngoài):

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); 

// Now convert to NSData structure to make it usable again 
NSData *out = [NSData dataWithBytes:cHMAC length:CC_SHA256_DIGEST_LENGTH]; 

// description converts to hex but puts <> around it and spaces every 4 bytes 
NSString *hash = [out description]; 
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""]; 
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""]; 
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""]; 
// hash is now a string with just the 40char hash value in it 
NSLog(@"%@",hash); 
3

Tôi không so sánh các mã sau vào đầu ra chức năng PHP nhưng nó làm việc cho tôi:

+(NSString *)signWithKey:(NSString *)key usingData:(NSString *)data 
{ 
    const char *cKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; 
    const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding]; 

    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; 

    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC); 

    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)]; 

    return [[HMAC.description stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""]; 
} 

Hãy cho tôi biết nếu nó là hữu ích ...

1

Đối với một tài liệu tham khảo băm HMAC này sẽ làm việc trên PHP.

- (NSString *)getToken:(NSString *)queryString 
{ 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; 
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    NSString *dateString = [formatter stringFromDate:[NSDate date]]; 
    NSDate *dateTodayUTC = [formatter dateFromString:dateString]; 
    NSString *nowTimestamp = [NSString stringWithFormat:@"%.f", [dateTodayUTC timeIntervalSince1970]]; 

    NSString *hashCombinations = [[NSString alloc] initWithFormat:@"%@%@%.f", queryString, public_api_key, [dateTodayUTC timeIntervalSince1970]]; 

    const char *privateKey = [private_api_key cStringUsingEncoding:NSUTF8StringEncoding]; 
    const char *requestData = [hashCombinations cStringUsingEncoding:NSUTF8StringEncoding]; 
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH]; 

    //HmacSHA256 
    CCHmac(kCCHmacAlgSHA256, // algorithm 
      privateKey, strlen(privateKey), // privateKey 
      requestData, strlen(requestData), // requestData 
      cHMAC); // length 

    NSString *hash; 
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; 
    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) 
     [output appendFormat:@"%02x", cHMAC[i]]; 
    hash = output; 

    NSString *base64HashString = [self base64String:hash]; 
    self.tokenLabel.text = hash; 

    NSLog(@"generated hash = %@", hash); 
    NSLog(@"base64 hash = %@", base64HashString); 
    NSLog(@"timestamp = %@ nsdate utc = %@", nowTimestamp, dateString); 
    NSLog(@"combinations %@", hashCombinations); 
    return [base64HashString urlencode]; 
} 

Bạn có thể sử dụng phương pháp base64 này.

- (NSString *)base64String:(NSString *)str 
{ 
    NSData *theData = [str dataUsingEncoding: NSASCIIStringEncoding]; 
    const uint8_t* input = (const uint8_t*)[theData bytes]; 
    NSInteger length = [theData length]; 

    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    NSMutableData* data = [NSMutableData dataWithLength:((length + 2)/3) * 4]; 
    uint8_t* output = (uint8_t*)data.mutableBytes; 

    NSInteger i; 
    for (i=0; i < length; i += 3) { 
     NSInteger value = 0; 
     NSInteger j; 
     for (j = i; j < (i + 3); j++) { 
      value <<= 8; 

      if (j < length) { 
       value |= (0xFF & input[j]); 
      } 
     } 

     NSInteger theIndex = (i/3) * 4; 
     output[theIndex + 0] =     table[(value >> 18) & 0x3F]; 
     output[theIndex + 1] =     table[(value >> 12) & 0x3F]; 
     output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; 
     output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; 
    } 

    return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
} 
0

Tôi nghĩ đó là nhiều giải pháp nhỏ gọn:

#import <CommonCrypto/CommonCrypto.h> 

... 

-(NSData*)Sha256WithKey:(NSData*)key andData:(NSData*)data{ 
    NSMutableData* result = [NSMutableData 
           dataWithCapacity:CC_SHA256_DIGEST_LENGTH]; 

    CCHmac(kCCHmacAlgSHA256, [key bytes], [key length], 
      [data bytes], [data length], result.mutableBytes); 

    return result; 
} 
....