最近接入pp助手的服务器端支付, 按照PP官方提供的文档来看, 需要服务器做RSA的验证.
首先我们来看下
RSA的几个标准用法
非对称加密解密
假设A要把内容传输给B
1. B生成RSA的公钥和密钥, 这是成对出现的, 密钥由B保存, 把公钥告诉A
2. A用B的公钥加密内容, 并把密文内容传输给B
3. B用密钥解密
验证
证明某个内容是你发的, 而不是被别人冒名顶替, 例如git的push中就带有这个功能
假设A有内容, B要验证内容确实由A发出
1. A生成公钥和密钥
2. A将内容做一个hash, 把hash码用自己的密钥加密并把这段密文发给B
3. B用A的公钥对密文进行验证, 即可确认密文是否由A发出
可以看出, 两种用法都是典型的非对称用法
但PP助手却干了件神奇的事情:
非对称当对称算法加解密
在PP SDK官方文档里, 我们找到了PHP语言的验证方法, 方法里使用了这样一个API
openssl_public_decrypt
从官方文档看得出这个使用openssl的算法库
类似的, 还有Java, C++, Python语言的处理方法
其中, C++也是用的openssl, Python则是需要预编译C库,在Ubuntu下需要手工patch M2Crypto的_ssl.c文件.
先不说这些非正规的编译,patch方法会造成多大的问题, 单就这个用公钥解密就很蛋疼
从之前的RSA算法中了解, 只有对公钥进行验证的方法, 也就是只能得到是还是不是的结果. 但PP的SDK则要求必须用公钥解密…
解出的数据为一段json, 以对比是否有订单篡改.
那么这种做法就等效于, 用最简单的异或+一个公钥进行订单加密, 然后同样用这个公钥进行解密
只不过用RSA感觉很高级…
这种做法一旦公钥在PP助手服务器或者玩家的开发服务器, 甚至源代码泄露, 那么马上就有很大的伪造订单的危险
我把这个做法发给朋友看, 他们说, 其实PP助手的开发者只管用了RSA, 跟传输不是明文就好了, 至于什么信息安全, 都是屁!