4

この方法で暗号化された値を使用して取得した SHA512 暗号化を使用した cHMAC が必要です。サーバー側の値は、Java を使用しているサーバー側と一致しません。この問題を解決するのに役立ちます。

サーバー側の暗号化された値は

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;
}

どこで間違いを犯しましたか?誰かがこれについて知っているなら、この問題を解決するために私を共有してください

4

1 に答える 1

3

使用しているクラスのドキュメントは見つかりませんが、メソッドの使用方法が間違ってHMacいる可能性が非常に高いです。doFinal私はあなたが欲しいと思う:

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

...ただし、プラットフォームのデフォルトのエンコーディングでは、このように使用するべきではありません。getBytes()次のように書く方がよいでしょう:

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

編集:コメントに記載されているように、Objective-C コードで ASCII を使用しています。エンコーディングを選択して、両方の場所で使用する必要があります。UTF-8 をお勧めします。

于 2013-08-14T15:21:03.787 に答える