【问题标题】:Java encryption and Force.com apex encryptionJava 加密和 Force.com 顶点加密
【发布时间】:2026-02-16 07:50:02
【问题描述】:

我需要在 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');

【问题讨论】:

    标签: java salesforce apex-code force.com


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • @LanceySnr 感谢您的快速回复。我不知道如何将指纹哈希值存储在顶点中,因为它们存储在 java 中。
      • 啊,你是说这个循环吗: for (int i = 0; i