Вот код 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 {...}
NSMutableData
? Из вашего Java-кода похоже, что фактические данные добавляются к соли. - person   schedule 12.04.2011