我們遇到了與HSBC Cpi接口相同的問題。
匯豐銀行不提供.NET包裝,和COM包裝 不能從64位應用程序調用。
這使得從64服務器(這可能 佔地面積新的生產服務器25%)幾乎IMPOSIBLE上部署它。
我們看了一些上市的途徑,但他們似乎 了很多工作。最後經過一番討論後,我們 想出了我們自己的實現,這看起來像 這個。
使用下面的Java代碼來獲取中間值散列
import java.io.Console;
import java.lang.*;
import java.util.*;
import com.clearcommerce.CpiTools.security.HashGenerator;
import com.clearcommerce.CpiTools.security.SecCrypto;
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Vector;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class Extract {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
String encryptedKey = "<YOUR SECRET KEY HERE>";
if (args.length == 1)
encryptedKey = args[0];
HexBinaryAdapter hb = new HexBinaryAdapter();
SecCrypto sc = new SecCrypto();
byte abyte0[] = sc.decryptToBinary(encryptedKey);
System.out.println("New Secret Base64 Encoded : " + new String(Base64Coder.encode(abyte0)));
System.out.println("New Secret Hex Encoded : " + hb.marshal(abyte0));
return;
}
catch(Exception ex)
{
System.out.println("Error:" + ex.getMessage());
}
}
}
然後使用下面的.NET代碼calcualte哈希
using System;
using System.Collections.Generic;
using System.Text;
namespace HsbcIntergration
{
internal static class CpiHashing
{
<USE THE VALUE RETURNED FROM THE JAVA CODE HERE>
private static readonly byte[] _secret = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
public static string ComputeHash(List<string> inputList)
{
return ComputeHash(inputList, _secret);
}
public static string ComputeHash(List<string> inputList, byte[] secretData)
{
List<string> orderedDataToHash = new List<string>(inputList);
orderedDataToHash.Sort(StringComparer.Ordinal);
StringBuilder sb = new StringBuilder();
foreach (string s in orderedDataToHash)
sb.Append(s);
List<byte> dataToHash = new List<byte>();
dataToHash.AddRange(Encoding.ASCII.GetBytes(sb.ToString()));
dataToHash.AddRange(secretData);
System.Security.Cryptography.HMAC sha = System.Security.Cryptography.HMACSHA1.Create();
sha.Key = secretData;
return Convert.ToBase64String(sha.ComputeHash(dataToHash.ToArray(), 0, dataToHash.Count));
}
}
}
感謝克里斯這個作品。 不幸的是匯豐不支持64位操作系統。 – 2009-04-20 14:25:51