战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

最近接入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, 跟传输不是明文就好了, 至于什么信息安全, 都是屁!

posted on 2015-10-12 14:27 战魂小筑 阅读(3253) 评论(3)  编辑 收藏 引用 所属分类: 游戏开发技术网络 服务器技术

评论

# re: pp助手服务器端支付的RSA的奇葩公钥解密设计 2015-10-18 22:35 非仙
不对吧?以前研究过RSA,确实可以用私钥加密 公钥解密的,并且可以防止篡改  回复  更多评论
  

# re: pp助手服务器端支付的RSA的奇葩公钥解密设计 2015-10-28 19:11 溪流
具体“PP助手”的方案是什么,文中没有具体说呀
如果是要防止被改,确实应该私钥加密公钥解密,因为别人造不出你手头的公钥能解的数据(其实相当于签名啦,只是没有先hash而已);如果要防止被偷看,那就应该是公钥加密私钥解密,因为别人解不出可读数据  回复  更多评论
  

# re: pp助手服务器端支付的RSA的奇葩公钥解密设计 2015-10-29 10:50 战魂小筑
公钥加密也是可以做的, 最后只有按照他们的方法来做, 虽然我们不是太愿意在golang里引入cgo带openssl公钥解密  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理