最近接入pp助手的服務(wù)器端支付, 按照PP官方提供的文檔來(lái)看, 需要服務(wù)器做RSA的驗(yàn)證.
首先我們來(lái)看下
RSA的幾個(gè)標(biāo)準(zhǔn)用法
非對(duì)稱加密解密
假設(shè)A要把內(nèi)容傳輸給B
1. B生成RSA的公鑰和密鑰, 這是成對(duì)出現(xiàn)的, 密鑰由B保存, 把公鑰告訴A
2. A用B的公鑰加密內(nèi)容, 并把密文內(nèi)容傳輸給B
3. B用密鑰解密
驗(yàn)證
證明某個(gè)內(nèi)容是你發(fā)的, 而不是被別人冒名頂替, 例如git的push中就帶有這個(gè)功能
假設(shè)A有內(nèi)容, B要驗(yàn)證內(nèi)容確實(shí)由A發(fā)出
1. A生成公鑰和密鑰
2. A將內(nèi)容做一個(gè)hash, 把hash碼用自己的密鑰加密并把這段密文發(fā)給B
3. B用A的公鑰對(duì)密文進(jìn)行驗(yàn)證, 即可確認(rèn)密文是否由A發(fā)出
可以看出, 兩種用法都是典型的非對(duì)稱用法
但PP助手卻干了件神奇的事情:
非對(duì)稱當(dāng)對(duì)稱算法加解密
在PP SDK官方文檔里, 我們找到了PHP語(yǔ)言的驗(yàn)證方法, 方法里使用了這樣一個(gè)API
openssl_public_decrypt
從官方文檔看得出這個(gè)使用openssl的算法庫(kù)
類似的, 還有Java, C++, Python語(yǔ)言的處理方法
其中, C++也是用的openssl, Python則是需要預(yù)編譯C庫(kù),在Ubuntu下需要手工patch M2Crypto的_ssl.c文件.
先不說(shuō)這些非正規(guī)的編譯,patch方法會(huì)造成多大的問(wèn)題, 單就這個(gè)用公鑰解密就很蛋疼
從之前的RSA算法中了解, 只有對(duì)公鑰進(jìn)行驗(yàn)證的方法, 也就是只能得到是還是不是的結(jié)果. 但PP的SDK則要求必須用公鑰解密…
解出的數(shù)據(jù)為一段json, 以對(duì)比是否有訂單篡改.
那么這種做法就等效于, 用最簡(jiǎn)單的異或+一個(gè)公鑰進(jìn)行訂單加密, 然后同樣用這個(gè)公鑰進(jìn)行解密
只不過(guò)用RSA感覺(jué)很高級(jí)…
這種做法一旦公鑰在PP助手服務(wù)器或者玩家的開(kāi)發(fā)服務(wù)器, 甚至源代碼泄露, 那么馬上就有很大的偽造訂單的危險(xiǎn)
我把這個(gè)做法發(fā)給朋友看, 他們說(shuō), 其實(shí)PP助手的開(kāi)發(fā)者只管用了RSA, 跟傳輸不是明文就好了, 至于什么信息安全, 都是屁!