1

这是一个 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 代码中的盐为 nil),这可以完美地工作,计算与 Java 代码相同的哈希值。问题是,如果我想计算两个 NSData 的哈希值,即有一个 salt(Java 代码中的第二个参数不是 nil)。可以看到在Java代码中,如果salt不为null,则执行一次更新,然后调用digest方法。我在某处读到,此操作等同于合并两个字节数组(数据和盐数组与 System.arraycopy),并在结果数组上调用摘要。但是,如果我在 Objective C 中执行此操作(使用 NSMutableData appendData 方法),我不会得到相同的结果。我怎样才能解决这个问题?在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 {...}
4

1 回答 1

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
于 2011-04-12T09:06:20.440 回答