我们正在尝试使用iOS / iPhone CommonCrypto库复制在我们的java 1.6服务器中完成的sha1加密编码。
我遇到的一个基本问题是,为什么Java的修复输出为40字节,而iOS的修复输出为20字节,来自SHA1算法
我找到了这个链接,它显示了如何在两种环境中生成编码,但输出的长度不同,对吗?
答案 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);
希望它有所帮助,欢呼:)