Хеш SHA512 цели C двух NSData

Вот код 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);

В Objective 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 {...}

person madik    schedule 12.04.2011    source источник
comment
Не могли бы вы вставить код, который вы использовали для добавления данных в NSMutableData? Из вашего Java-кода похоже, что фактические данные добавляются к соли.   -  person    schedule 12.04.2011


Ответы (1)


Я не запускал этот код и не сравнивал его с реализацией 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
person Community    schedule 12.04.2011
comment
Вот метод, который я использовал раньше: + (NSData *)getHashOfData:(NSData *)sourceData withSalt:(NSData *)salt { NSData *hash = nil; NSMutableData *merge = [NSMutableData dataWithData:sourceData]; if (salt!= nil) { [merge appendData:salt]; } хэш = [объединить SHA512Hash]; хэш возврата; } ` - person madik; 12.04.2011
comment
@user703598 Таким образом, вы добавляете соль к своим данным, хотя на самом деле ваш Java-код, кажется, добавляет ее. - person ; 12.04.2011
comment
То есть я должен добавлять данные к соли, а не соль к данным? - person madik; 12.04.2011
comment
@user703598 user703598 Вот что делает ваш код Java. Обратите внимание, что он вызывает md.update(salt) перед вызовом md.digest(data): сначала соль, затем данные. - person ; 12.04.2011
comment
Да, вы правы, предложенный вами способ (обратный порядок добавления) и код, который вы пишете, дают тот же результат. Но результат не равен результату кода Java. Думаю ошибка где-то в другом... - person madik; 12.04.2011
comment
@user703598 user703598 Хм, очень плохо. Вы можете попробовать использовать онлайн-генератор SHA-512 и сравнить его результат с теми, которые вы получаете из своего кода Java и из кода Objective-C, или использовать openssl dgst -sha512 в Terminal.app. - person ; 12.04.2011