在iPhone上生成SHA1(图像)?(结果不正确)



我到处找,都找不到问题的解决方案。我已经为Android和Windows编写了一个程序,可以计算给定图像的SHA1哈希。我用下载的HashCalc确认了这些哈希。然而,当我尝试为iPhone做同样的事情时,我会得到一个完全不同的散列。我相信这与在计算哈希之前将图像转换为字节数组有关。这是我的代码:

- (void)imagePickerCotroller:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[imageview setImage:image];
NSData* imageData = UIImageJPEGRepresentation(image, 1);
NSString *hash = makeSHA1(imageData);
[filepath setText: hash];
[self dismissModalViewControllerAnimated:YES];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[self dismissModalViewControllerAnimated:YES];
}

NSString* makeSHA1(NSData *data) {       
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, data.length, digest);    
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];    
for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
    [output appendFormat:@"%02x", digest[i]];    
return output;
}

我怀疑这里的问题是使用UIImageJPEGRepresentation()转换数据。即使您从JPEG数据开始,也不能保证它会返回与您开始时完全相同的字节。

我(未经测试)的建议是,您向CGDataProvider索取原始数据。类似这样的东西:

CGImageRef cgImage = [image CGImage];
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef imageData = CGDataProviderCopyData(provider);
if (imageData != NULL) {
  ...
  CFRelease(imageData);
}

最新更新