CryptoDigest / SHA1 的 Base64 编码 - 字符串与 Java / Python 的结果不匹配
我正在尝试在IOS上获取一个字符串的消息摘要。我试过使用一个叫nv-ios-digest的第三方哈希库,但还是没能成功。
下面是我用来获取消息摘要的base64编码字符串的函数。
-(NSString*) sha1:(NSString*)input //sha1- Digest
{
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
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]];//digest
}
return [NSString stringWithFormat:@"%@",[[[output description] dataUsingEncoding:NSUTF8StringEncoding]base64EncodedStringWithOptions:0]]; //base64 encoded
}
这是我用的示例输入字符串 - '530279591878676249714013992002683ec3a85216db22238a12fcf11a07606ecbfb57b5'
当我在Java或Python中使用这个字符串时,得到的结果都是 - '5VNqZRB1JiRUieUj0DufgeUbuHQ='。
但是在IOS中,我得到的结果是 'ZTU1MzZhNjUxMDc1MjYyNDU0ODllNTIzZDAzYjlmODFlNTFiYjg3NA=='。
这是我在Python中使用的代码:
import hashlib
import base64
def checkForDigestKey(somestring):
msgDigest = hashlib.sha1()
msgDigest.update(somestring)
print base64.b64encode(msgDigest.digest())
如果有办法在IOS上得到相同的结果,请告诉我。
1 个回答
3
你在Python中生成的是一个二进制摘要,而在iOS中生成的是一个十六进制摘要。
这两个摘要在其他方面是相同的:
>>> # iOS-produced base64 value
...
>>> 'ZTU1MzZhNjUxMDc1MjYyNDU0ODllNTIzZDAzYjlmODFlNTFiYjg3NA=='.decode('base64')
'e5536a65107526245489e523d03b9f81e51bb874'
>>> # Python-produced base64 value
...
>>> '5VNqZRB1JiRUieUj0DufgeUbuHQ='.decode('base64')
'\xe5Sje\x10u&$T\x89\xe5#\xd0;\x9f\x81\xe5\x1b\xb8t'
>>> from binascii import hexlify
>>> # Python-produced value converted to a hex representation
...
>>> hexlify('5VNqZRB1JiRUieUj0DufgeUbuHQ='.decode('base64'))
'e5536a65107526245489e523d03b9f81e51bb874'
在Python中使用 base64.b64encode(msgDigest.hexdigest())
可以得到相同的值,或者在iOS中对 digest
的字节进行Base-64编码,而不是使用十六进制字符。