SHA-1编码Java和iOS / iPhone之间的区别

时间:2012-01-19 21:04:04

标签: java iphone ios encoding sha1

我们正在尝试使用iOS / iPhone CommonCrypto库复制在我们的java 1.6服务器中完成的sha1加密编码。

我遇到的一个基本问题是,为什么Java的修复输出为40字节,而iOS的修复输出为20字节,来自SHA1算法

我找到了这个链接,它显示了如何在两种环境中生成编码,但输出的长度不同,对吗?

How to SHA1 hash a string in Android?

3 个答案:

答案 0 :(得分:2)

SHA1算法总是返回160位(或20个字节)。

我怀疑你的Java代码正在将字节数组转换为十六进制字符串,即每个字节显示为两个字符。

要将其与CommonCrypto进行比较,您可以:

  • 将Java输出转换为字节数组;或

  • 将CommonCrypto字节数组转换为十六进制字符串(这是您问题中的链接正在进行的操作)

在比较值之前。

答案 1 :(得分:0)

昨天我正面临着这个问题,我正在使用的sha1算法实现,与android不兼容,经过或多或少的一小时搜索android和ios实现后,我意识到这只是String Formating的一个问题。 (将X更改为x)。

我正在分享我们正在使用的sha1算法实现ios / android兼容的片段...希望这有助于作为@poupou理论答案的版本:-)。

public static String sha1(String s) {
    MessageDigest digest = null;
    try {
        digest = MessageDigest.getInstance("SHA-1");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    digest.reset();
    byte[] data = digest.digest(s.getBytes());
    return String.format("%0" + (data.length * 2) + "X", new BigInteger(1, data));
}


-(NSString*) sha1:(NSString*)input
{
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];
    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;

}

答案 2 :(得分:0)

Android或iOS,SHA-1的预期长度为20个字节。

但是sha-1算法返回存在差异。

iOS根本不会以空字符终止结果。

所以我想重点是不要使用sha输出长度来生成输出数据,而是使用CC_SHA1_DIGEST_LENGTH常量 - 这是20。

uint8_t digest[CC_SHA1_DIGEST_LENGTH+1];
memset(digest,0,CC_SHA1_DIGEST_LENGTH+1);
NSData* data = [stringToHash dataUsingEncoding:NSUTF8StringEncoding];
char* sha = CC_SHA1(data.bytes, data.length, digest);
NSData *hashedData = [NSData dataWithBytes:sha length:strlen(sha)];

如果你自己终止摘要,那么sha输出是正确的:

error_reporting(E_ALL ^ E_NOTICE);

希望它有所帮助,欢呼:)