Хэш-алгоритм SHA256 дает разные результаты в iOS с использованием Common Crypto и OpenSSL

Отличаются ли хэш-функции в Apple Common Crypto и OpenSSL? Я пытаюсь сгенерировать SHA256 из одной и той же строки, используя два приведенных ниже метода, и оба дают разные результаты. Я делаю что-то другое? У меня сложилось впечатление, что алгоритм SHA256 одинаков для всех платформ и дает одинаковый результат в iOS, Android, Windows и т. Д.

ПРИМЕЧАНИЕ. Когда я попробовал то же самое в Android, используя MessageDigest.getInstance("SHA-256"), я получил тот же результат, что и результат CommonCrypto Hash, но результат OpenSSL отличается.

// Apple Common Crypto - SHA256
- (NSData *)sha256:(NSData *)data {
    unsigned char hashResult[CC_SHA256_DIGEST_LENGTH];
    if ( CC_SHA256([data bytes], (unsigned int)[data length], hashResult) ) {
        NSData *sha256 = [NSData dataWithBytes:hashResult length:CC_SHA256_DIGEST_LENGTH];
        return sha256;
    }   
}

// SRP OpenSSL - SHA256
- (NSData *)sha256_2:(NSData *)data {
    unsigned char hashResult[SHA256_DIGEST_LENGTH];
    unsigned char *bin = (unsigned char *) [data bytes];
    NSInteger length = sizeof(bin);
    [_srpAuth hashWrapper:SRP_SHA256 input:bin size:length output:hashResult];
    NSData *sha256 = [NSData dataWithBytes:hashResult length:SHA256_DIGEST_LENGTH];
    return sha256;
}

1 ответ

Решение
NSInteger length = sizeof(bin);

Даст вам размер беззнакового указателя на символ - 4 байта на 32-битном устройстве и 8 на 64-битном.

Что вы хотите

NSInteger length = data.length

так как это даст вам количество байтов для хеширования

Другие вопросы по тегам