1

我需要在 force.com apex 中转换这个 java 代码。我尝试使用 Crypto 类来获得相同的加密,但没有得到如何在 APEX 的最后一个变量“fingerprintHash”中获得相同的值。任何人都可以在这个技术问题上帮助我吗?

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');
4

2 回答 2

5

问题似乎是您在 javaside 对输出进行十六进制编码,但在顶点端对输出进行 base64 编码,请尝试使用EncodingUtils.convertToHex而不是EncodingUtils.base64Encode

于 2011-12-16T17:27:16.650 回答
0

您看起来在加密方面正朝着正确的方向前进,但是您使用时间戳作为输入字符串的一部分,因此除非您非常幸运,否则您总是在编码不同的字符串。在移植代码时,请删除时间戳,以便确保输入字符串相同 - 如果它们不相同,那么您将永远不会得到相同的结果。

一旦您确定您的加密按预期工作,那么您可以将时间戳放回代码安全的地方,因为它知道它将以与原始 java 代码相同的方式运行。

于 2011-12-16T10:10:06.063 回答