16 Stimmen

Sha256 in Objective-C für iPhone

Wenn ich diesen Code verwende, um ein sha256 einer Zeichenkette zu erstellen

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

Der Hash wird korrekt zurückgegeben, aber ich muss eine Zeichenfolge wie die folgende einfügen \x00\x25\x53 und in diesem Fall gibt die Funktion einen leeren String sha256 zurück, da die angegebene Kodierung nicht zur Konvertierung des Empfängers verwendet werden kann.

Meine Frage ist nun: Wie kann ich diese Sonderzeichen einfügen, um einen korrekten Hash zu erzeugen? Danke

42voto

Jagadeeshwar Punkte 861

Versuchen Sie dies, es hat bei mir funktioniert

1) So erhalten Sie einen Hash für eine reine Texteingabe

-(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) Um Hash zu erhalten für NSData als Eingabe

Anmerkung:- Ich habe verwendet NSData Kategorie, daher lautet der Code wie folgt

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

2voto

Es ist wichtig zu wissen, dass Sie importieren müssen:

#import <CommonCrypto/CommonDigest.h>

Ich hoffe, das hilft!

0voto

Sven Punkte 22195

Sie sollten wahrscheinlich die NSData anstelle von NSString dann. Woher haben Sie diese Schnur?

0voto

Spydy Punkte 2467

Jemand sucht die Lösung in Swift 3.0. hier ist

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

Wie man es benutzt

let signatures = "yourStringToBeConverted".get_sha256_String()

Vergessen Sie auch nicht, zu importieren #import <CommonCrypto/CommonHMAC.h> in Ihrem Überbrückungs-Kopfzeile.h

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X