cordova-plugin-alipay
cordova-plugin-alipay copied to clipboard
内嵌商户私钥会不会泄露?
目前的用法要把商户私钥内嵌在插件源代码中,并会被编译到客户端app当中,这样会有商户私钥泄露的风险。
看起来这个私钥的唯一用途是要在客户端进行签名,但是签名这个过程完全可以在服务器端完成,这样能避免私钥泄露。
@chen4342024 请问有必要担心这个问题吗?支付宝商户私钥泄露算不算是个问题呢?
细看了下发现支付金额也需要这个私钥来签名,那这个私钥泄露的后果还是挺严重的,可以用来篡改支付信息
String out_trade_no = args.optString(0);
String subject = args.optString(1);
String body = args.optString(2);
String total_fee = args.optString(3);
String url = args.optString(4);
//服务器异步通知页面路径,需要自己定义 参数 notify_url,如果商户没设定,则不会进行该操作
//String url = "http://host:port/path/Alipay/notify_url.aspx";
final String orderInfo = getOrderInfo(out_trade_no,subject, body,total_fee,url);
String sign = sign(orderInfo);
try {
// 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
恩。支付宝官方建议是把私钥保存在服务端。但是,由于我的插件并没有投入商业使用,所以并没有解决,欢迎帮忙完善一下
试着把签名相关的代码移除之后,剩余的代码极少,基本上这个简单的项目就能满足需求了:
https://github.com/sinofool/cordova-alipay-plugin
@zhougn 确实代码变得极少,看起来像是直接封装了sdk的cordova plugin。但是缺点是paystr如果错了的话,很难debug,支付宝的sdk不友好是有目共睹的啊,要不然为什么要提供稍微详细一些的demo呢。个人更喜欢现在这个方式。 @chen4342024 如果能把私钥、签名这些都放在js接口那边做个参数就好了,用的人如果连私钥存在js里面都能接受,那就说明人家的私钥只存在app上就行了。
@SeanWangDev 私钥之类的还是推荐放在服务端会好一点, 比较安全
@chen4342024 没错,最终的实现是这样的。plugin只接收一个参数,就是paystr。这个url不在前端组装了。直接在后端做一个类似微信的prepay操作,然后从后端返回组装好的paystr。这样暴露信息的几率低,可以在后台跟踪用户的支付操作。而且将来如果alipay更新了,只要还是paystr,就不担心改js。