Sha256 в Objective-C для iPhone - PullRequest
       15

Sha256 в Objective-C для iPhone

15 голосов
/ 14 сентября 2010

Когда я использую этот код для создания sha256 строки

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

Он правильно возвращает хеш, но мне нужно вставить строку, подобную этой \ x00 \ x25 \ x53 и в этом случае функция возвращает sha256 пустой строки, поскольку указанную кодировку нельзя использовать для преобразования получателя.

Теперь мой вопрос: как вставить эти специальные символы для создания правильного хэша?Спасибо

Ответы [ 4 ]

39 голосов
/ 11 июля 2012

Попробуйте, у меня это сработало

1) Чтобы получить хэш для ввода простого текста

-(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) Чтобы получить хэш для NSData в качестве ввода

Примечание: - Я использовал категорию NSData, поэтому код следующий:

    - (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;
}
2 голосов
/ 27 сентября 2017

Важно знать, что вам нужно импортировать:

#import <CommonCrypto/CommonDigest.h>

Надеюсь, эта помощь!

0 голосов
/ 28 ноября 2017

Кто-то ищет решение в Swift 3.0. здесь

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

Как использовать

let signatures = "yourStringToBeConverted".get_sha256_String()

также не забыли импортировать #import <CommonCrypto/CommonHMAC.h> в ваш Bridging-Header.h

0 голосов
/ 15 сентября 2010

Вы, вероятно, должны использовать NSData вместо NSString тогда. Откуда вы взяли эту строку?

...