Как сгенерировать SHA256 и CRC32 в iOS

Я выполняю работу по загрузке файлов. Я хочу сгенерировать хэши SHA256 и CRC32. Может ли кто-нибудь помочь мне, как мне сгенерировать этот хэш? Я хочу, чтобы это работало для iOS.


person NSCry    schedule 25.02.2012    source источник
comment
Вы пробовали погуглить?   -  person Dani    schedule 25.02.2012


Ответы (4)


SHA256 доступен в CommonCrypto. CRC32 — это не хэш, это проверка циклическим избыточным кодом.

Пример кода:

#import <CommonCrypto/CommonDigest.h>

NSData *dataIn = [@"Now is the time for all good computers to come to the aid of their masters." dataUsingEncoding:NSASCIIStringEncoding];
NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];

CC_SHA256(dataIn.bytes, dataIn.length,  macOut.mutableBytes);

NSLog(@"dataIn: %@", dataIn);
NSLog(@"macOut: %@", macOut);

NSLog output:
dataIn: ‹4e6f7720 69732074 68652074 696d6520 666f7220 616c6c20 676f6f64 20636f6d 70757465 72732074 6f20636f 6d652074 6f207468 65206169 64206f66 20746865 6972206d 61737465 72732e>

macOut: ‹53f89cf6 7ebfbe56 89f1f76a 3843dfd1 09d68c5b a938dcd2 9a12004e 108260cb>

person zaph    schedule 25.02.2012
comment
хорошо. Но я хочу получить значение CRC32 для любых данных. Есть ли способ получить его в ios? - person NSCry; 25.02.2012
comment
Я хочу работать с ним для ios. В ios я не нахожу ‹CommonCrypto/CommonDigest.h› в системе безопасности. - person NSCry; 25.02.2012
comment
Да, Apple переходит к преобразованиям, но я только что проверил это с iOS 5.0 SDK. Что касается crc32, то он доступен в нескольких библиотеках, таких как zlib. - person zaph; 25.02.2012
comment
Ваш SHA256 работает для меня. У меня есть еще один вопрос. Я генерирую хэш из данных изображения (NSData). Есть ли какой-нибудь калькулятор/веб-сайт, где я могу это проверить? - person NSCry; 26.02.2012
comment
Я проверил его онлайн-генератор sha256, хеш-код не совпадает. Есть решения? - person NSCry; 29.02.2012
comment
Обратите внимание, что CC_SHA256 вычисляет хэш данных, а не строки. Если вы получаете другое значение, вы каким-то образом предоставляете другой ввод. Каким сайтом вы пользовались? - person zaph; 29.02.2012
comment
Я проверил с помощью xorbin.com/tools/sha256-hash-calculator и в В моем случае я генерирую sha256 из изображения nsdata. Как мне проверить правильность моего хэша? этот хэш не соответствует веб-серверу. Любые предложения - person NSCry; 29.02.2012
comment
Как отправил? Ожидает ли сервер кодировку Base64? Использует ли сервер функцию HMAC, а не только MAC? Вставка двоичных данных на веб-страницу, вероятно, не сработает. - person zaph; 29.02.2012
comment
CRC32 не является безопасным хэшем, как SHA-1, но это определенно хеш-функция. - person Glenn Maynard; 16.11.2012
comment
Отличный ответ, спасибо. Однако убедитесь, что ваш код готов к интернационализации. Все, что вам нужно сделать, это изменить кодировку на NSUTF8StringEncoding. Затем, чтобы рассчитать длину, вы должны strlen(dataIn.bytes) - person fzaziz; 12.12.2012
comment
@fzaziz dataIn.length предоставляет длину данных, не имеет значения, как были созданы NSData. Также strlen() ожидает строку с завершающим нулем, которая не гарантируется и не присутствует в этом примере. Я согласен с тем, что интернационализация важна, но не имеет отношения к вопросу/ответу. - person zaph; 12.12.2012
comment
@Zaph, к сожалению, твоя точка зрения на strlen верна. Я чувствую, что интернационализация очень важна, особенно в таком вопросе. Так как никто не будет просить SHA256 для китайца. Вопрос в том, чтобы получить хеш для строки. Не думайте, что строка на английском языке, просто изменив кодировку на NSUTF8StringEncoding, вы можете предотвратить потенциальные проблемы для многих людей. - person fzaziz; 13.12.2012
comment
Спасибо за пример. Отлично сработало для меня. - person bduhbya; 08.09.2017
comment
Чтобы получить доступ к библиотеке CommonCrypto, убедитесь, что вы добавили iOS Security.framework в свой проект. - person Dimitris; 16.12.2017

Для обоих из них вы можете использовать этот смысл:

https://gist.github.com/paul-delange/6808278

И пример

NSString* crc32 = (__bridge NSString*)TGDFileHashCreateWithPath((__bridge CFStringRef)filepath, TGDFileHashDefaultChunkSizeForReadingData, TGDChecksumAlgorithmCRC32);
person Paul de Lange    schedule 03.10.2013
comment
Замечательно. Спасибо. - person Drakes; 05.08.2015

Этот метод будет генерировать crc32c, используемый gcloud на iOS, из пути к файлу. Если вам нужен стандартный crc32, просто раскомментируйте другое значение CRC32_POLYNOMIAL.

Он читает файл, заданный кусками по 512 КБ, поэтому его можно использовать для больших файлов.

- (NSString*) crc32c:(NSString*)filepath{

    ///  using crc code from
    //   http://classroomm.com/objective-c/index.php?action=printpage;topic=2891.0
    //   by rgronlie


    //this is the standard crc32 polynomial
    //uint32_t CRC32_POLYNOMIAL = 0xEDB88320;

    //this is the crc32c one
    uint32_t CRC32_POLYNOMIAL = 0x82F63B78L;
    uint32_t  CRC32C_SEED = 0xFFFFFFFFL;

    // create and populate a lookup table
    uint32_t* pCRCTable = malloc(sizeof(uint32_t) * 256);

    for (uint32_t i = 0; i <= 255; i++)
    {
        uint32_t crc32 = i;
        for (uint32_t j = 8; j > 0; j--)
        {
            if ((crc32 & 1) == 1)
                crc32 = (crc32 >> 1) ^ CRC32_POLYNOMIAL;
            else
                crc32 >>= 1;
        }
        pCRCTable[i] = crc32;
    }

    // get a handle to the file
    NSFileHandle *filehandle = [NSFileHandle fileHandleForReadingAtPath:filepath];

    if(filehandle == NULL){
        NSLog(@"failed to create file handle");
        return nil;
    }

    // a buffer to read into
    NSData* databuffer;

    uint32_t crc = CRC32C_SEED;

    // read the file in chunks of 512KB

    while(true){
        databuffer = [filehandle readDataOfLength: 512 * 1024];

        // if there is nothing left finish
        if([databuffer length] == 0){
            break;
        }
        // otherwise run each chunk through the lookup table
        uint8_t *pBytes = (uint8_t *)[databuffer bytes];
        uint32_t length = [databuffer length];

        while (length--)
        {
            crc = (crc>>8) ^ pCRCTable[(crc & 0xFF) ^ *pBytes++];
        }
    }

    // clean up
    [filehandle closeFile];
    free(pCRCTable);

    // this is the result
    uint32_t hash = crc ^ 0xFFFFFFFFL;

    // reverse it for endianness
    uint32_t hash_reversed = CFSwapInt32HostToBig(hash);
    // as raw bytes
    NSData* hash_data = [NSData dataWithBytes: &hash_reversed length: sizeof(hash_reversed)];
    // return base64 encoded
    return [hash_data base64EncodedStringWithOptions:0];
}
person Paul Harter    schedule 04.10.2016

нет приложений, которые могут генерировать хеш для ios

Это должно работать .... для Mac

http://itunes.apple.com/us/app/digiprint/id473233587?mt=12

person Yagnesh Mistry    schedule 25.02.2012
comment
Хорошая попытка помочь Ягнешу, но я думаю, что оригинальный постер спрашивает, как программно генерировать числа SHA256 и CRC32 для его собственной программы, которая выполняет загрузку. - person Michael Dautermann; 25.02.2012
comment
@MichaelDautermann да, ты прав. у вас есть предложения?? - person NSCry; 25.02.2012
comment
@MichaelDautermann Я реализовал CC_SHA256 (dataIn.bytes, dataIn.length, macOut.mutableBytes); и получить данные хэша sha256, но они не совпадают с онлайн-генератором хэшей, какие-либо предложения - person NSCry; 29.02.2012