API接口呜象,類似http://mypay.com/refund/order_id=123&mch_id=123
尉辑,這個請求我以商戶mch_id=123的身份給訂單號為order_id=123退款畜疾,如果服務(wù)器不辯別請求發(fā)起者的身份直接做相應(yīng)的操作,那是及其危險的茶没。
一般的筒占,在PC端,我們是通過加密的cookie來做會員的辨識和維持會話的蛛株;但是cookie是屬于瀏覽器的本地存儲功能团赁。APP端不能用,所以我們得通過token參數(shù)來辨識會員谨履;而這個token該如何處理呢欢摄?
延伸開來,接口的安全性主要圍繞Token笋粟、Timestamp和Sign三個機(jī)制展開設(shè)計怀挠,保證接口的數(shù)據(jù)不會被篡改和重復(fù)調(diào)用。
一般來說害捕,在前端對數(shù)據(jù)做加密或者前面绿淋,是不現(xiàn)實(shí)的。前后端使用HTTP協(xié)議進(jìn)行交互的時候尝盼,由于HTTP報文為明文躬它,所以通常情況下對于比較敏感的信息可以通過在前端加密,然后在后端解密實(shí)現(xiàn)"混淆"的效果东涡,避免在傳輸過程中敏感信息的泄露(如冯吓,密碼,證件信息等)疮跑。不過前端加密只能保證傳輸過程中信息是‘混淆’過的组贺,對于高手來說,打個debugger祖娘,照樣可以獲取到數(shù)據(jù)失尖,并不安全,所謂的前端加密只是稍微增加了攻擊者的成本渐苏,并不能保證真正的安全掀潮。即使你說在前端做了RSA公鑰加密,也很有可能被高手獲取到公鑰琼富,并使用該公鑰加密數(shù)據(jù)后發(fā)給服務(wù)端仪吧,所以務(wù)必認(rèn)為前端的數(shù)據(jù)是不可靠的,服務(wù)端要加以辯別鞠眉。敏感信息建議上https薯鼠。
所以一般建議上https择诈,敏感信息md5混淆,前端不傳輸金額字段出皇,而是傳遞商品id羞芍,后端取商品id對應(yīng)的金額,將金額等參數(shù)加簽名發(fā)送到支付系統(tǒng)郊艘。金額可以是明文的荷科。
一. Token
token授權(quán)機(jī)制:用戶使用用戶名密碼登錄后,后臺給客戶端返回一個token(通常是UUID)纱注,并將Token-UserId鍵值對存儲在redis中步做,以后客戶端每次請求帶上token,服務(wù)端獲取到對應(yīng)的UserId進(jìn)行操作奈附。如果Token不存在全度,說明請求無效。
弊端:token可以被抓包獲取斥滤,無法預(yù)防MITM中間人攻擊
二. Timestamp
用戶每次請求都帶上當(dāng)前時間的時間戳timestamp将鸵,服務(wù)器收到請求后對比時間差,超過一定時長(如5分鐘)佑颇,則認(rèn)為請求失效顶掉。時間戳超時機(jī)制是防御DOS攻擊的有效手段。
三. Sign和RSA算法
將token挑胸,timestamp等其他參數(shù)以字典序排序痒筒,再加上一個客戶端私密的唯一id(這種一般做在服務(wù)端,前端無法安全保存這個id)或使用私鑰簽名茬贵,將前面的字符串做MD5等加密簿透,作為sign參數(shù)傳遞給服務(wù)端。
四. 公鑰加密解藻,私鑰簽名
地球上最重要的加密算法:非對稱加密的RSA算法老充。公鑰加密的數(shù)據(jù),可以用私鑰解密螟左;私鑰簽名(加密)的數(shù)據(jù)啡浊,可以用公鑰驗(yàn)簽。
1977年胶背,三位數(shù)學(xué)家Rivest巷嚣、Shamir 和 Adleman 設(shè)計了一種算法,可以實(shí)現(xiàn)非對稱加密钳吟。這種算法用他們?nèi)齻€人的名字命名廷粒,叫RSA算法。
RSA原理是對極大整數(shù)做因數(shù)分解砸抛,以下摘自維基百科评雌。
五. 微信支付的簽名方式
暫時比較忙沒時間树枫,將于7月29日晚更新直焙。
來更新啦景东。
微信支付安全規(guī)范,可以查看官方文檔https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
第1點(diǎn)中奔誓,其簽名算法最重要的一步斤吐,是在最后拼接了商戶私密的API密鑰,然后通過md5生成簽名厨喂,這時即使金額是明文也是安全的和措,如果有人獲取并修改了金額,但是簽名字段他是無法偽造的蜕煌,因?yàn)樗麩o法知道商戶的API密鑰派阱。當(dāng)然,除了微信支付的拼接API生成簽名的方法斜纪,我們也可以通過java自帶的security包進(jìn)行私鑰簽名贫母。其中nonce隨機(jī)字符串,微信支付應(yīng)該做了校驗(yàn)盒刚,可以防止重放攻擊腺劣,保證一次請求有效,如果nonce在微信支付那邊已經(jīng)存在因块,說明該請求已執(zhí)行過橘原,拒絕執(zhí)行該請求。
參考資料
阮一峰老師的博客-RSA算法原理:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
維基百科:https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95
喜歡我的文章的小伙伴歡迎關(guān)注我的公眾號“東瓜東瓜”哦涡上,自己上微信搜一下趾断。