it-swarm.com.de

Wie kann ich einen SHA-2 (idealerweise) berechnen? SHA 256 oder SHA 512) Hash in iOS?

Die Sicherheitsdienste-API scheint mir nicht zu erlauben, einen Hash direkt zu berechnen. Es gibt viele öffentlich zugängliche und frei lizenzierte Versionen, aber ich würde lieber eine Systembibliotheksimplementierung verwenden, wenn möglich.

Auf die Daten kann über NSData oder einfache Zeiger zugegriffen werden.

Die kryptographische Stärke des Hash ist für mich wichtig. SHA-256 ist die minimal akzeptable Hashgröße.

57
James

Das ist was ich für SHA1 verwende:

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

Ersetzen Sie CC_SHA1 durch CC_SHA256 (oder je nach Bedarf) sowie CC_SHA1_DIGEST_LENGTH durch CC_SHA256_DIGEST_LENGTH.

79
alex-i

Hier ist ein ziemlich ähnliches, basierend auf 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;
}

(Credits gehen an http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1 )

32
Ege Akpinar

Das hat bei mir funktioniert

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

Unter dem Link, den ich zum Erstellen von Dokument-Hashwerten verwendet habe, ist dieser Hashwert besonders für große Dateien sehr einfach und leicht zu berechnen.

Link: http://www.joel.lopes-da-silva.com/2010/09/07/compute-md5-or-sha-hash-of-large-file-efficient-on-ios-und- mac-os-x/Kommentar-Seite-1/# Kommentar-18533

1
Sunil aruru

Ich habe https://stackoverflow.com/a/13199111/1254812 etwas aufgeräumt und als NSString-Erweiterung strukturiert

@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