Sha256 в Objective-C для iPhone

Когда я использую этот код для создания 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 пустой строки, потому что указанная кодировка не может использоваться для преобразования получатель.

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


person pascalbros    schedule 14.09.2010    source источник


Ответы (4)


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

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;
}
person Jagadeeshwar    schedule 11.07.2012
comment
Как сделать хэш для специальных символов, таких как Lähettäjä: ?? - person Basbous; 05.03.2013
comment
Спасибо за это! Первый тоже работает со специальными символами! - person Jaydeep Jadav; 24.08.2013
comment
Небольшое замечание, для чего if (!self)? Если экземпляр nil, сигнал никогда не попадет в этот метод, верно? - person André Fratelli; 31.03.2015
comment
как я могу использовать это с ключом, с ключом и строкой? - person Mr.G; 27.02.2016
comment
@Mr.G не понял, как именно вы хотите использовать алгоритм SHA. Но если это шифрование, которое вы ищете, то это вам не поможет. - person Jagadeeshwar; 27.02.2016
comment
@Jagadeeshwar похоже на hash_init('sha256',HASH_HMAC,$salt);hash_update($hash,$plain_hash); в php хочу сделать ту же функциональность в iOS - person Mr.G; 28.02.2016
comment
Что такое CC_SHA256_DIGEST_LENGTH? Понятно - нужно #include <CommonCrypto/CommonDigest.h> - person CyberMew; 18.03.2016
comment
Если вы получаете ошибку неявного преобразования, вам нужно изменить строку на эту CC_SHA256(str, (CC_LONG)strlen(str), result); - person Scott Fister; 03.12.2016

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

#import <CommonCrypto/CommonDigest.h>

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

person Fernando Valenzuela    schedule 27.09.2017

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

person Sven    schedule 15.09.2010
comment
Например, мой цикл преобразует эту строку 002553 в \x00\x25\x53, и я бы отправил эти байты в функцию sha256 для создания хэша, но у меня явно проблемы с кодировкой! - person pascalbros; 15.09.2010

Кто-то ищет решение в 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> в свой Bridge-Header.h

person Spydy    schedule 28.11.2017