2010-09-14 16 views
13

kiedy używam tego kodu, aby utworzyć SHA256 napisuSHA256 w Objective-C dla iPhone

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

Zwraca hash poprawnie, ale muszę wstawić ciąg takiego \ x00 \ x25 \ x53 iw tym przypadku funkcja zwraca sha256 z pustym łańcuchem, ponieważ określone kodowanie nie może być użyte do konwersji odbiornika.

Moje pytanie brzmi: jak wstawić znaki specjalne do wygenerowania poprawnego skrótu? Dzięki

Odpowiedz

0

Prawdopodobnie powinieneś wtedy użyć NSData zamiast NSString. Skąd czerpiesz ten napis?

+0

mojego cyklu trasform na przykład ten ciąg " 002553 "in" \ x00 \ x25 \ x53 "i wysłałbym te bajty do funkcji sha256, aby utworzyć skrót, ale oczywiście mam problem z kodowaniem! – pascalbros

36

Spróbuj tego, że pracował dla mnie

1), aby uzyskać wartość mieszania dla wejścia tekstowy

-(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), aby uzyskać hash dla NSData jako wejście

Uwaga: - Użyłem kategorii NSData, więc kod jest następujący:

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

Jak zrobić skrót dla znaków specjalnych, takich jak "Lähettäjä:" ?? – Basbous

+0

Dzięki za to! Pierwszy z nich pracuje również z postaciami specjalnymi! –

+0

Niewielka uwaga, do czego służy 'if (! Self)'? Jeśli instancja jest 'nil', sygnał nigdy nie dotrze do tej metody, prawda? –

1

Ważne jest, aby wiedzieć, że trzeba importować:

#import <CommonCrypto/CommonDigest.h> 

Nadzieja to pomaga!

0

Niektórzy szukają rozwiązania w Swift 3.0. tutaj jest

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

jak go używać

let signatures = "yourStringToBeConverted".get_sha256_String() 

również nie zapomniał importować #import <CommonCrypto/CommonHMAC.h> w Bridging-header.h

Powiązane problemy