2011-12-16 38 views
1

我需要在force.com apex中轉換此java代碼。我試圖使用Crypto類來獲得相同的加密,但沒有得到如何獲得APEX中最後一個變量「fingerprintHash」的相同值。任何人都可以幫我解決這個技術問題嗎?Java加密和Force.com apex加密

Random generator = new Random(); 
sequence =Long.parseLong(sequence+""+generator.nextInt(1000)); 

timeStamp = System.currentTimeMillis()/1000; 

try { 
    SecretKey key = new SecretKeySpec(transactionKey.getBytes(), "HmacMD5"); 
    Mac mac = Mac.getInstance("HmacMD5"); 
    mac.init(key); 

    String inputstring = loginID + "^" + sequence + "^" + timeStamp + "^" + amount + "^"; 
    byte[] result = mac.doFinal(inputstring.getBytes()); 

    StringBuffer strbuf = new StringBuffer(result.length * 2); 

    for (int i = 0; i < result.length; i++) { 
     if (((int) result[i] & 0xff) < 0x10) { 
      strbuf.append("0"); 
     } 

     strbuf.append(Long.toString((int) result[i] & 0xff, 16)); 
    } 

    fingerprintHash = strbuf.toString(); //need this result for variable x_fp_hash 

頂點的代碼,我試圖爲: -

String API_Login_Id='6########'; 
String TXn_Key='6###############'; 
String amount='55'; 
sequence = '300'; 

long timeStamp = System.currentTimeMillis()/1000; 

String inputStr = API_Login_Id + '^' + sequence + '^' + timeStamp + '^' + amount + '^'; 
String algorithmName = 'hmacMD5'; 

Blob mac = Crypto.generateMac(algorithmName,Blob.valueOf(inputStr),Blob.valueOf(TXn_Key)); 
String macUrl =EncodingUtil.urlEncode(EncodingUtil.base64Encode(mac), 'UTF-8'); 

回答

5

的問題似乎是,你是十六進制編碼的javaside的輸出,但在編碼的頂點側輸出的base64,請嘗試使用EncodingUtils.convertToHex代替EncodingUtils.base64Encode

0

你看起來正在沿着正確的線,關於加密標題,但是你使用時間戳的一部分你的輸入字符串,所以除非你天文幸運,你總是編碼不同的字符串。當你在移植代碼的時候,刪除時間戳記,以確保你的輸入字符串是相同的 - 如果它們不相同,那麼你永遠不會得到相同的結果。

一旦您確定您的加密工作正常,那麼您可以將時間戳放回代碼中,以確保它的功能與原始Java代碼相同。

+0

@LanceySnr感謝快速回復。我沒有得到我如何可以存儲fingar打印哈希值在尖頂,因爲他們存儲在Java中。 ((int(int)result [i]&0xff)<0x10){ – gaurav 2011-12-16 11:33:00

+0

如果((int(int)result [i]&0xff)<0x10)strobf.append(「0 「); } – 2011-12-16 11:38:31