这是一个 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 {...}