web-dev-qa-db-fra.com

Comment puis-je calculer un SHA-2 (idéalement SHA 256 ou SHA 512) hachage dans iOS?

L'API des services de sécurité ne semble pas me permettre de calculer directement un hachage. Il existe de nombreuses versions du domaine public et sous licence libérale disponibles, mais je préférerais utiliser une implémentation de bibliothèque système si possible.

Les données sont accessibles via NSData ou des pointeurs simples.

La force cryptographique du hachage est importante pour moi. SHA-256 est la taille de hachage minimale acceptable.

57
James

C'est ce que j'utilise pour SHA1:

#import <CommonCrypto/CommonDigest.h>

+ (NSData *)sha1:(NSData *)data {
    unsigned char hash[CC_SHA1_DIGEST_LENGTH];
    if ( CC_SHA1([data bytes], [data length], hash) ) {
        NSData *sha1 = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];        
        return sha1;
    }
return nil;
}

Remplacez CC_SHA1 par CC_SHA256 (ou selon votre choix), ainsi que CC_SHA1_DIGEST_LENGTH par CC_SHA256_DIGEST_LENGTH.

79
alex-i

En voici un assez similaire basé sur NSString 

+ (NSString *)hashed_string:(NSString *)input
{
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];
    uint8_t digest[CC_SHA256_DIGEST_LENGTH];

    // This is an iOS5-specific method.
    // It takes in the data, how much data, and then output format, which in this case is an int array.
    CC_SHA256(data.bytes, data.length, digest);

    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];

    // Parse through the CC_SHA256 results (stored inside of digest[]).
    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
        [output appendFormat:@"%02x", digest[i]];
    }

    return output;
}

(Les crédits vont à http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1 )

32
Ege Akpinar

C'est ce qui a fonctionné pour moi

func sha256(securityString : String) -> String {
    let data = securityString.dataUsingEncoding(NSUTF8StringEncoding)!
    var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
    CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
    let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))
    for byte in hash {
        output.appendFormat("%02x", byte)
    }
    return output as String
}
3
mdkr

Ci-dessous, le lien que j'ai utilisé pour créer la valeur de hachage du document. Il est très simple et facile à calculer, spécialement pour les gros fichiers.

Lien: http://www.joel.lopes-da-silva.com/2010/09/07/compute-md5-or-sha-hash-of-large-file-efficiently-on-ios-and- mac-os-x/comment-page-1/# comment-18533

1
Sunil aruru

J'ai nettoyé https://stackoverflow.com/a/13199111/1254812 un peu et l'ai structuré comme une extension NSString

@interface NSString (SHA2HEX)

/*
 Get the SHA2 (256 bit) digest as a hex string.
 */
@property (nonatomic, readonly) NSString* sha2hex;
@end

@implementation NSString (SHA2HEX)

- (NSString*)sha2hex
{
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];

    if (data.length > UINT32_MAX)
        return nil;

    uint8_t digest[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(data.bytes, (CC_LONG)data.length, digest);

    const int hexlen = CC_SHA256_DIGEST_LENGTH * 2;
    NSMutableString *hexstr = [NSMutableString stringWithCapacity:hexlen];

    for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
        [hexstr appendFormat:@"%02x", digest[i]];
    }

    return hexstr;
}

@end
0
dcow
+ (NSData *)sha256DataFromData:(NSData *)data {
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256([data bytes], (int)[data length], result);
    return [NSData dataWithBytes:result length:CC_SHA256_DIGEST_LENGTH];
}
0
Boris