CryptoDigest / SHA1 的 Base64 编码 - 字符串与 Java / Python 的结果不匹配

0 投票
1 回答
1322 浏览
提问于 2025-04-18 07:59

我正在尝试在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编码,而不是使用十六进制字符。

撰写回答