接口數(shù)據(jù)安全說(shuō)明
我們開(kāi)發(fā)過(guò)程編寫(xiě)接口時(shí)蹋盆,除了要實(shí)現(xiàn)業(yè)務(wù)邏輯傀缩,安全性也是需要考慮的一部分。不僅要保證數(shù)據(jù)傳輸過(guò)程中的安全坷檩,還有考慮數(shù)據(jù)到達(dá)服務(wù)端時(shí)如何識(shí)別數(shù)據(jù) 却音,最后就是數(shù)據(jù)存儲(chǔ)的安全性 。
幾種實(shí)現(xiàn)方式
(1)對(duì)稱加密
- AES:Advanced Encryption Standard 高級(jí)加密標(biāo)準(zhǔn)矢炼,是下一代的加密算法標(biāo)準(zhǔn)系瓢,速度快,安全級(jí)別高句灌。
- DES:Data Encryption Standard 數(shù)據(jù)加密標(biāo)準(zhǔn)夷陋,速度較快,適用于加密大量數(shù)據(jù)的場(chǎng)合胰锌。
- 3DES:Triple DES 是基于DES骗绕,對(duì)一塊數(shù)據(jù)用三個(gè)不同的密鑰進(jìn)行三次加密,強(qiáng)度更高
(2)非稱加密
- RSA:由 RSA公司發(fā)明资昧,是一個(gè)支持變長(zhǎng)密鑰的公共密鑰算法酬土,需要加密的文件塊的長(zhǎng)度也是可變的;
- DSA(Digital Signature Algorithm):數(shù)字簽名算法格带,是一種標(biāo)準(zhǔn)的DSS(數(shù)字簽名標(biāo)準(zhǔn))撤缴;
- DH(Diffie-Hellman算法,密鑰一致協(xié)議)
- ECC(橢圓曲線加密算法)
(3)單向加密(非可逆加密)
- MD5:信息摘要算法
- SHA:安全散列算法
- HMAC:散列消息鑒別碼
接口數(shù)據(jù)安全案例
敏感數(shù)據(jù)的安全存儲(chǔ)(如 密碼,手機(jī)號(hào))
密碼:
要點(diǎn): 無(wú)法逆向解密
常用方式: 單向加密 + 鹽(鹽在后臺(tái)生成)手機(jī),身份證等
要點(diǎn): 需要逆向解密獲取
常用方式: 對(duì)稱加密
token授權(quán)認(rèn)證機(jī)制
一般是帶有身份認(rèn)證的系統(tǒng),主要的授權(quán)認(rèn)證方案
- Redis
- JWT
數(shù)據(jù)加簽驗(yàn)簽
比如對(duì)接外部系統(tǒng)或者系統(tǒng)之間無(wú)同一套身份認(rèn)證體系
數(shù)據(jù)報(bào)文加簽驗(yàn)簽叽唱,是保證數(shù)據(jù)傳輸安全的常用手段 屈呕,它可以保證數(shù)據(jù)在傳輸過(guò)程中不被篡改 。以前我做的企業(yè)轉(zhuǎn)賬系統(tǒng) 棺亭,就用了加簽驗(yàn)簽虎眨。
數(shù)據(jù)加簽 :用Hash算法(如MD5,或者SHA-256)把原始請(qǐng)求參數(shù)生成報(bào)文摘要,然后用私鑰對(duì)這個(gè)摘要進(jìn)行加密专甩,就得到這個(gè)報(bào)文對(duì)應(yīng)的數(shù)字簽名
sign(這個(gè)過(guò)程就是加簽 )钟鸵。通常來(lái)說(shuō)呢,請(qǐng)求方會(huì)把數(shù)字簽名和報(bào)文原文 一并發(fā)送給接收方涤躲。
下面可以看下簡(jiǎn)單的案例分析說(shuō)明
參數(shù)如 ?amount=1000
-- 只有md5
參數(shù) ?amount=1000&sign=md5(amount=1000)
1. 只改參數(shù)明文,如 ?amount=2000&sign=md5(amount=1000)
NO-通過(guò)不了,sign不一樣
2. 改明文并且也使用md5,如 ?amount=2000&sign=md5(amount=2000)
OK-可以通過(guò),這樣非常不安全
-- md5+秘鑰key(參數(shù)拼接一個(gè)秘鑰key)
參數(shù) ?amount=1000&sign=md5(amount=1000&key=keyabc)
1. 同樣只改參數(shù)明文肯定不行
2. 改明文并且也使用md5,如 ?amount=2000&sign=md5(amount=2000)
NO-偽造者拿不到這個(gè)key
-- md5+雙向加密(sign為雙向加密密文)(雙向加密指對(duì)稱加密或者非對(duì)稱加密)
參數(shù) ?amount=1000&sign=md5(aes(amount=1000, keyabc))
1. 同樣只改參數(shù)明文肯定不行
2. 改明文并且也使用md5,如 ?amount=2000&sign=md5(amount=2000)
NO-偽造者拿不到這個(gè)秘鑰
當(dāng)然,一般還會(huì)對(duì)sign做一下Base64編碼
https
如果你想對(duì)所有字段都加密的話,一般都推薦使用https協(xié)議 贡未。https其實(shí)就是在http和tcp之間添加一層加密層SSL种樱。
有了https等加密數(shù)據(jù),為什么還需要加簽驗(yàn)簽?
有些小伙伴可能有疑問(wèn)俊卤,加簽驗(yàn)簽主要是防止數(shù)據(jù)在傳輸過(guò)程中被篡改嫩挤,那如果都用了https下協(xié)議加密數(shù)據(jù)了,為什么還會(huì)被篡改呢消恍?為什么還需要加簽驗(yàn)簽?zāi)兀?/p>
數(shù)據(jù)在傳輸過(guò)程中被加密了岂昭,理論上,即使被抓包狠怨,數(shù)據(jù)也不會(huì)被篡改约啊。但是https不是絕對(duì)安全 的哦,還有一個(gè)點(diǎn):https加密的部分只是在外網(wǎng)佣赖,然后有很多服務(wù)是內(nèi)網(wǎng)相互跳轉(zhuǎn)的恰矩,加簽也可以在這里保證不被中間人篡改 ,所以一般轉(zhuǎn)賬類安全性要求高的接口開(kāi)發(fā)憎蛤,都需要加簽驗(yàn)簽
數(shù)據(jù)安全的幾種優(yōu)化
時(shí)間戳timestamp超時(shí)機(jī)制
數(shù)據(jù)是很容易抓包的外傅,假設(shè)我們用了https和加簽,即使中間人抓到了數(shù)據(jù)報(bào)文俩檬,它也看不到真實(shí)數(shù)據(jù)萎胰。但是有些不法者,他根本不關(guān)心真實(shí)的數(shù)據(jù)棚辽,而是直接拿到抓取的數(shù)據(jù)包技竟,進(jìn)行惡意請(qǐng)求(比如DOS攻擊 ),以搞垮你的系統(tǒng)晚胡。
我們可以引入時(shí)間戳超時(shí)機(jī)制 灵奖,來(lái)保證接口安全。就是:用戶每次請(qǐng)求都帶上當(dāng)前時(shí)間的時(shí)間戳timestamp估盘,服務(wù)端接收到timestamp后瓷患,解密,驗(yàn)簽通過(guò)后遣妥,與服務(wù)器當(dāng)前時(shí)間進(jìn)行比對(duì)擅编,如果時(shí)間差大于一定時(shí)間 (比如3分鐘),則認(rèn)為該請(qǐng)求無(wú)效。
使用時(shí)間戳 timestamp+隨機(jī)數(shù)nonce
時(shí)間戳超時(shí)機(jī)制也是有漏洞的爱态,如果是在時(shí)間差內(nèi) 谭贪,黑客進(jìn)行的重放攻擊,那就不好使了锦担〖笫叮可以使用timestamp+nonce方案。
nonce指唯一的隨機(jī)字符串洞渔,用來(lái)標(biāo)識(shí)每個(gè)被簽名的請(qǐng)求套媚。我們可以將每次請(qǐng)求的nonce參數(shù)存儲(chǔ)到一個(gè)“set集合”中,或者可以json格式存儲(chǔ)到數(shù)據(jù)庫(kù)或緩存中磁椒。每次處理HTTP請(qǐng)求時(shí)堤瘤,首先判斷該請(qǐng)求的nonce參數(shù)是否在該“集合”中,如果存在則認(rèn)為是非法請(qǐng)求浆熔。
然而對(duì)服務(wù)器來(lái)說(shuō)本辐,永久保存nonce的代價(jià)是非常大的∫皆觯可以結(jié)合timestamp來(lái)優(yōu)化慎皱。因?yàn)閠imstamp參數(shù)對(duì)于超過(guò)3分鐘的請(qǐng)求,都認(rèn)為非法請(qǐng)求调窍,所以我們只需要存儲(chǔ)3分鐘的nonce參數(shù)的“集合”即可宝冕。
限流機(jī)制
對(duì)于核心業(yè)務(wù)的接口,結(jié)合業(yè)務(wù)我們判斷某一段時(shí)間內(nèi)可以接受多少次請(qǐng)求邓萨。避免第三方惡意頻繁調(diào)用接口地梨,我們就可以采用限流機(jī)制〉蘅遥可以使用Guava的RateLimiter單機(jī)版限流宝剖,也可以使用Redis分布式限流,還可以使用阿里開(kāi)源組件sentinel限流歉甚。
黑/白名單機(jī)制
系統(tǒng)可以設(shè)置黑白名單万细,設(shè)置黑名單限制惡意請(qǐng)求的用戶或者IP,白名單對(duì)信任的用戶或IP放心纸泄。我們?cè)谂c第三方支付渠道對(duì)接時(shí)赖钞,比如銀聯(lián),與他們接口進(jìn)行交互時(shí)聘裁,需要先申請(qǐng)網(wǎng)絡(luò)白名單雪营,銀聯(lián)將我們業(yè)務(wù)系統(tǒng)的外網(wǎng)IP加入到他們的白名單中,我們才能訪問(wèn)他們的服務(wù)衡便。
微信和支付寶
微信和支付寶采用的基本上都是數(shù)據(jù)加簽驗(yàn)簽的方式,并且都已封裝到SDK中
當(dāng)然也并不是只有一種方式,比如微信的微信支付一般采用的是 SHA + RSA, 微信服務(wù)號(hào)和小程序用的又是access_token的方式.
具體還得看對(duì)應(yīng)文檔