Вот код 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 {...}