【问题标题】:IOS HMAC-SHA1 Different than Standard Java HMAC-SHA1IOS HMAC-SHA1 不同于标准 Java HMAC-SHA1
【发布时间】:2013-08-14 15:16:53
【问题描述】:

我需要使用 SHA512 加密的 cHMAC 我使用加密值这种方法和服务器端值不匹配服务器端他们使用 Java 可以请帮我解决这个问题。

服务器端 encrted 值为

85d86c928825ef85d5329893f2cf2cba9ba6354582d54b5f1c7aaf69b6d72f71b742ae67f3e400d2e4b367f62a45b9948b512ae9a8efc0bcd667f1cdb0a66c6d

objective-c 加密值为

  f242340a3664ea149717b943087cb8a5d92d6d25af5f5d8e0f51a6c4f0c1060830128e0798e6b300a81a1401612f0000d75d0000d3e27401e8d9ffbf221e1401

Objetive-C 代码:

-(NSString *)createSHA512:(NSString *)string withKey:(NSString *)key
 {
NSLog(@"key isss %@",key);
NSLog(@"string isss %@",string);

const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [string cStringUsingEncoding:NSASCIIStringEncoding];

unsigned char cHMAC[CC_SHA512_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSData *HMACData = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
NSLog(@"bytes data is %@",HMACData);

NSString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];

for (int i = 0; i < HMACData.length; ++i)
    HMAC = [HMAC stringByAppendingFormat:@"%02lx", (unsigned long)buffer[i]];

return HMAC;
}

Java 代码:

public static String SHA512(String ta, String key, String xtra){
Digest digest = new SHA512Digest ();
HMac hmac = new HMac(digest);
String temp =ta.concat(key.concat(xtra));
hmac.init(new KeyParameter(key.getBytes()));
hmac.update(temp.getBytes(), 0, temp.length());
byte[] resBuf = new byte[digest.getDigestSize()];
 hmac.doFinal(resBuf, 0);
String resStr = convertToHex(resBuf);
return resStr;
}

我在哪里做错了?如果有人知道这件事,请分享我来解决这个问题

【问题讨论】:

    标签: java ios objective-c ios5 ios6


    【解决方案1】:

    我找不到您正在使用的 HMac 类的文档,但我强烈怀疑您错误地使用了 doFinal 方法。我怀疑你想要:

    byte[] results = hmac.doFinal(temp.getBytes(), 0, temp.length());
    

    ...虽然你真的,真的不应该像这样使用getBytes(),使用平台默认编码。最好写:

    byte[] binaryData = temp.getBytes("UTF-8");
    byte[] results = hmac.doFinal(binaryData);
    

    编辑:如 cmets 中所述,您在 Objective-C 代码中使用 ASCII。您应该选择一种编码并在两个地方都使用它 - 我建议使用 UTF-8。

    【讨论】:

    • 当然如果你在Java端使用“UTF-8”那么你需要使用NSUTF8StringEncoding来匹配。
    猜你喜欢
    • 2011-10-26
    • 2012-10-12
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多