【发布时间】:2017-11-11 08:08:33
【问题描述】:
我有一个使用第三方支付门户的在线电子商务网站。在第三方支付门户要求所有人开始使用带有其他支付参数的哈希键之前,支付门户一直运行良好。
现在的问题是第三方支付门户只提供了一页文档来实现哈希键。
这是提供的文档:-
加密算法
为了在传输和发布数据时减轻参数的修改/修改,商家可以使用 Telenor POC 提供的哈希密钥对请求进行加密。该加密请求与主请求一起发送,然后在 OPS 端进行协调以检测参数是否更改。可以使用以下算法进行加密:
创建请求中所有字段的映射 映射字段 = new HashMap();
fields.put("数量", "10");
fields.put("storeId", "28");
fields.put("orderRefNum", "11001");
fields.put("expiryDate", "20150101 151515");
fields.put("postBackURL", "http://localhost:9081/local/status.php");
从第一步创建的地图中获取字段名列表
List fieldNames = new ArrayList(fields.keySet());
根据地图键按字母顺序对地图字段进行排序
Collections.sort(fieldNames);
创建以下格式的字符串: 金额=10&expiryDate=20150101151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28
使用 AES/ECB/PKCS5Padding 算法,使用上一步生成的密钥和字符串进行加密
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
加密值 = 新 String(Base64.encodeBase64(cipher.doFinal(value.getBytes())));
现在另一个问题是我没有任何Java经验。
我拨打了第三方支付门户帮助热线,他们只是帮我告诉了我钥匙。
如果有人能帮助我告诉我第 5 步的 Ruby 等价物是什么,我将不胜感激。谢谢
刚刚在在线java编译器上尝试了提供的代码:-
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class encryptData {
public static void main(String[] args) {
String data="amount=10&expiryDate=20150101 151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28";
String key="89OUITUPRL3I8H3G";
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
encryptedValue = new String(Base64.encodeBase64(cipher.doFinal(data.getBytes())));
}
}
这是错误:-
/tmp/java_Ramvov/encryptData.java:16: 错误:找不到符号
encryptedValue = new String(Base64.encodeBase64(cipher.doFinal(data.getBytes())));
^
符号:变量 encryptedValue
位置:加密数据类
/tmp/java_Ramvov/encryptData.java:16: 错误:找不到符号
encryptedValue = new String(Base64.encodeBase64(cipher.doFinal(data.getBytes())));
^
符号:方法 encodeBase64(byte[])
位置:Base64 类
2 个错误
任何帮助将不胜感激
我也尝试在 ruby 中重现这个 java 代码:-
data = "amount=10&expiryDate=20150101151515&orderRefNum=11001&postBackURL=http://localhost:9081/local/status.php&storeId=28"
cipher = OpenSSL::Cipher.new("AES-128-ECB")
cipher.encrypt()
cipher.key = "89OUITUPRL4I9H3G"
crypt = cipher.update(data) + cipher.final()
crypt_string = (Base64.encode64(crypt))
但生成的加密被支付门户拒绝
【问题讨论】:
-
他们有示例输出吗?这样您就可以验证实现的正确性
-
@Srgio Tulentsev 没有提供。他们刚刚给我的另一个信息是,最后一步中的“value”变量是这个字符串“amount=10&expiryDate=20150101151515&orderRefNum=11001&postBackURL=localhost:9081/local/status.php&storeId=28”
-
好吧,你怎么能确定你正确地实现了密码呢?向他们询问示例输出。或者运行那个 java 代码。
-
@Srgio Tulentsev 我已经编辑了这个问题,但我在编译 Java 代码时遇到了错误
标签: java ruby encryption