2010-09-14 3 views
13

Lorsque j'utilise ce code pour créer une SHA256 d'une chaîneSHA256 en Objective-C pour iPhone

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

Il retourne correctement le hachage, mais je dois insérer une chaîne comme celui-ci \ x00 \ x25 \ x53 et dans ce cas, la fonction renvoie un sha256 de chaîne vide car le codage spécifié ne peut pas être utilisé pour convertir le récepteur. Maintenant, ma question est: Comment insérer ces caractères spéciaux pour générer un hachage correct? Merci

Répondre

0

Vous devriez probablement utiliser NSData au lieu de NSString ensuite. D'où obtenez-vous cette chaîne?

+0

Mon cycle trasform par exemple cette chaîne " 002553 "dans" \ x00 \ x25 \ x53 "et je voudrais envoyer ce bytes à la fonction sha256 pour créer le hachage, mais j'ai un problème avec l'encodage évidemment! – pascalbros

36

Essayez cela, il a travaillé pour moi

1) Pour obtenir un hachage pour la saisie de texte brut

-(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) Pour obtenir hachage pour NSData comme entrée

Note: - J'ai utilisé NSData catégorie, de sorte que le code est le suivant

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

Comment faire un hachage pour les caractères spéciaux comme "Lähettäjä:" ?? – Basbous

+0

Merci pour cela! Le premier travaille avec des caractères spéciaux aussi! –

+0

Légère remarque, à quoi sert le 'if (! Self)'? Si l'instance est 'nil', le signal n'atteindra jamais cette méthode, non? –

1

Il est important de savoir que vous devez importer:

#import <CommonCrypto/CommonDigest.h> 

Hope this aide!

0

Quelqu'un cherchant la solution dans Swift 3.0. voici

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

Comment l'utiliser

let signatures = "yourStringToBeConverted".get_sha256_String() 

aussi ne pas oublié d'importer #import <CommonCrypto/CommonHMAC.h> dans votre pontage header.h

Questions connexes