2010-09-14 42 views
13

Khi tôi sử dụng mã này để tạo ra một sha256 của một chuỗiSHA256 trong Objective-C cho iPhone

unsigned char hashedChars[32]; 
NSString *inputString; 
inputString = [NSString stringWithFormat:@"hello"]; 
NSData * inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding]; 
CC_SHA256(inputData.bytes, inputData.length, hashedChars); 

Nó trả về băm một cách chính xác, nhưng tôi cần phải chèn một chuỗi như thế này \ x00 \ x25 \ x53 và trong trường hợp này, hàm trả về một chuỗi sha256 của chuỗi rỗng vì mã hóa được chỉ định không thể được sử dụng để chuyển đổi người nhận.

Bây giờ, câu hỏi của tôi là: Làm cách nào để chèn ký tự đặc biệt này để tạo mã băm chính xác? Cảm ơn

Trả lời

0

Bạn có thể nên sử dụng NSData thay vì NSString sau đó. Bạn lấy chuỗi đó từ đâu?

+0

chu kỳ trasform My ví dụ chuỗi này " 002553 "in" \ x00 \ x25 \ x53 "và tôi sẽ gửi byte này đến hàm sha256 để tạo băm, nhưng tôi có vấn đề với mã hóa rõ ràng! – pascalbros

36

Hãy thử điều này, nó làm việc cho tôi

1) Để có được một băm cho đầu vào văn bản đơn giản

-(NSString*)sha256HashFor:(NSString*)input 
{ 
    const char* str = [input UTF8String]; 
    unsigned char result[CC_SHA256_DIGEST_LENGTH]; 
    CC_SHA256(str, strlen(str), result); 

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2]; 
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) 
    { 
     [ret appendFormat:@"%02x",result[i]]; 
    } 
    return ret; 
} 

2) Để có được băm cho NSData như là đầu vào

Lưu ý: - Tôi đã sử dụng loại NSData, vì vậy, mã như sau

- (NSString *)SHA256_HASH { 
    //if (!self) return nil; 

    unsigned char hash[CC_SHA256_DIGEST_LENGTH]; 
    if (CC_SHA256([(NSData*)self bytes], [(NSData*)self length], hash)) { 
     NSData *sha2 = [NSData dataWithBytes:hash length:CC_SHA256_DIGEST_LENGTH]; 

     // description converts to hex but puts <> around it and spaces every 4 bytes 
     NSString *hash = [sha2 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 = %@",hash); 

     // Format SHA256 fingerprint like 
     // 00:00:00:00:00:00:00:00:00 
     int keyLength=[hash length]; 
     NSString *formattedKey = @""; 
     for (int i=0; i<keyLength; i+=2) { 
      NSString *substr=[hash substringWithRange:NSMakeRange(i, 2)]; 
      if (i!=keyLength-2) 
       substr=[substr stringByAppendingString:@":"]; 
      formattedKey = [formattedKey stringByAppendingString:substr]; 
     } 

     return formattedKey; 
    } 
    return nil; 
} 
+0

Cách tạo băm cho các ký tự đặc biệt như "Lähettäjä:" ?? – Basbous

+0

Cảm ơn bạn! Đầu tiên là làm việc với các nhân vật đặc biệt nữa! –

+0

Nhận xét nhẹ nhàng, 'if (! Self)' là gì? Nếu thể hiện là 'nil', tín hiệu sẽ không bao giờ đến phương thức này, đúng không? –

1

Điều quan trọng cần biết là bạn cần phải nhập:

#import <CommonCrypto/CommonDigest.h> 

Hy vọng trợ giúp này!

0

Một số người tìm kiếm giải pháp trong Swift 3.0. đây là

extension String { 

// MARK: - SHA256 
func get_sha256_String() -> String { 
    guard let data = self.data(using: .utf8) else { 
     print("Data not available") 
     return "" 
    } 
    return getHexString(fromData: digest(input: data as NSData)) 
} 

private func digest(input : NSData) -> NSData { 
    let digestLength = Int(CC_SHA256_DIGEST_LENGTH) 
    var hashValue = [UInt8](repeating: 0, count: digestLength) 
    CC_SHA256(input.bytes, UInt32(input.length), &hashValue) 
    return NSData(bytes: hashValue, length: digestLength) 
} 

private func getHexString(fromData data: NSData) -> String { 
    var bytes = [UInt8](repeating: 0, count: data.length) 
    data.getBytes(&bytes, length: data.length) 

    var hexString = "" 
    for byte in bytes { 
     hexString += String(format:"%02x", UInt8(byte)) 
    } 
    return hexString 
}} 

Làm thế nào để sử dụng nó

let signatures = "yourStringToBeConverted".get_sha256_String() 

cũng không quên để nhập khẩu #import <CommonCrypto/CommonHMAC.h> trong bạn Bridging-Header.h

Các vấn đề liên quan