2010-09-14 5 views
13

Quando uso questo codice per creare uno sha256 di una stringaSHA256 in Objective-C per iPhone

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

Esso restituisce l'hash in modo corretto, ma ho bisogno di inserire una stringa come questo \ x00 \ x25 \ x53 e in questo caso, la funzione restituisce uno sha256 di stringa vuota perché la codifica specificata non può essere utilizzata per convertire il ricevitore.

Ora, la mia domanda è: come inserire questi caratteri speciali per generare un hash corretto? Grazie

risposta

0

Probabilmente dovresti usare NSData invece di NSString quindi. Da dove prendi quella stringa?

+0

Il mio ciclo trasform per esempio questa stringa " 002553 "in" \ x00 \ x25 \ x53 "e manderei questi byte alla funzione sha256 per creare l'hash, ma ho ovviamente problemi con la codifica! – pascalbros

36

Prova questo, ha funzionato per me

1) Per ottenere un hash per l'immissione di testo

-(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) Per ottenere hash per NSData come ingresso

Nota: - Ho usato la categoria NSData, quindi il codice è il seguente

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

Come creare un hash per caratteri speciali come "Lähettäjä:" ?? – Basbous

+0

Grazie per questo! Il primo funziona anche con caratteri speciali! –

+0

Nota leggera, a cosa serve 'if (! Self)'? Se l'istanza è 'nil', il segnale non arriverà mai a questo metodo, giusto? –

1

E 'importante sapere che è necessario importare:

#import <CommonCrypto/CommonDigest.h> 

Spero che questo aiuto!

0

Qualcuno guarda la soluzione in Swift 3.0. qui è

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

come usarlo

let signatures = "yourStringToBeConverted".get_sha256_String() 

, inoltre, non ha dimenticato di importare #import <CommonCrypto/CommonHMAC.h> nel vostro Colmare-header.h