Объективный SHA512 хэш двух NSData - PullRequest
1 голос
/ 12 апреля 2011

Вот код Java, который вычисляет хеш SHA512 байтового массива с солью:

private static String DIGEST_ALGORITHM = "SHA-512";

    public static byte[] getHash(final byte[] data, final byte[] salt) throws NoSuchAlgorithmException
{
    final MessageDigest md = MessageDigest.getInstance(DIGEST_ALGORITHM);
    md.reset();
    if (salt != null)
    {
        md.update(salt);
    }
    return md.digest(data);

В Цели C я использую этот алгоритм для вычисления хеша NSData:

@implementation NSData (CommonDigest)

- (NSData *) SHA512Hash {
unsigned char hash[CC_SHA512_DIGEST_LENGTH];
(void) CC_SHA512( [self bytes], (CC_LONG)[self length], hash );
return ( [NSData dataWithBytes: hash length: CC_SHA512_DIGEST_LENGTH] );
}

Это отлично работает, вычисляет тот же хеш, что и код Java, если я использую те же самые отдельные данные (то есть, соль равна нулю в коде Java).Проблема заключается в том, что, если я хочу вычислить хэш из двух NSData, то есть есть соль (второй параметр в коде Java не ноль).Вы можете видеть, что в коде Java, если соль не равна нулю, он выполняет обновление, а затем вызывает метод дайджеста.Где-то я читал, что эта операция равна объединению двухбайтового массива (массивы данных и солей с System.arraycopy) и вызову дайджеста для массива результатов.Однако, если я делаю это в Objective C (с методом appendData NSMutableData), я не получаю тот же результат.Как я могу это исправить?Я вижу в классе CommonDigest, есть похожие методы, но я не знаю, как я могу их использовать ... Я думаю об этих методах:

extern int CC_SHA512_Init(CC_SHA512_CTX *c);
extern int CC_SHA512_Update(CC_SHA512_CTX *c, const void *data, CC_LONG len);
extern int CC_SHA512_Final(unsigned char *md, CC_SHA512_CTX *c);
extern unsigned char *CC_SHA512(const void *data, CC_LONG len, unsigned char *md);

Итак, я хотел бы создатьтакой метод:

@implementation NSData (CommonDigest)

- (NSData *)SHA512HashWithSalt:(NSData *)salt {...}

1 Ответ

1 голос
/ 12 апреля 2011

Я не запускал этот код и сравнивал его с реализацией Java, но он должен работать:

@implementation NSData (CommonDigest)

- (NSData *)SHA512HashWithSalt:(NSData *)salt {
    unsigned char hash[CC_SHA512_DIGEST_LENGTH];
    CC_SHA512_CTX context;
    CC_SHA512_Init(&context);
    if ([salt length]) {
        CC_SHA512_Update(&context, [salt bytes], (CC_LONG)[salt length]);
    }
    CC_SHA512_Update(&context, [self bytes], (CC_LONG)[self length]);
    CC_SHA512_Final(hash, &context);
    return [NSData dataWithBytes:hash length:CC_SHA512_DIGEST_LENGTH];
}

@end
...