https請(qǐng)求還需要對(duì)參數(shù)做簽名嗎?答案是需要的,但不必須。
https本身基于安全證書(shū)傳輸數(shù)據(jù),在數(shù)據(jù)傳輸過(guò)程中已經(jīng)對(duì)數(shù)據(jù)做了加密處理,但是他本身屬于傳輸層協(xié)議,所以只能保證傳輸?shù)陌踩浴?/p>
那什么是簽名?
簽名分為加簽和驗(yàn)簽,客戶端加簽,服務(wù)端驗(yàn)簽。客戶端在調(diào)用接口的時(shí)候,對(duì)入?yún)?huì)按照某種規(guī)則進(jìn)行MD5計(jì)算得到sign值,然后再把該值作為入?yún)l(fā)送給服務(wù)端,服務(wù)端拿到所有參數(shù)后剔除簽名,再按照同樣的規(guī)則對(duì)入?yún)⑦M(jìn)行MD5計(jì)算得到一個(gè)MD5值,再和客戶端的MD5值進(jìn)行比對(duì),比對(duì)正確代表驗(yàn)簽成功,否則驗(yàn)簽失敗。
例如原始參數(shù)參數(shù):
加簽規(guī)則
1,按照參數(shù)屬性key的ASCII排序并以&符號(hào)拼接參數(shù)
2,拼接上秘鑰key
3,MD計(jì)算得到簽名sign
拼接后的字符串:”name=臥龍鳳雛&age=1000&key” md5后得到 xxxxx,那最終傳給服務(wù)端的參數(shù)如下:
{“name”:”臥龍鳳雛”,”age”:1000, “sign”:”xxxxx”}
服務(wù)端拿到參數(shù)sign,并對(duì)原始參數(shù)加簽,然后比對(duì)客戶端的sign,如果比對(duì)正確即為通過(guò)。
看到這里大家應(yīng)該明白了,https和加簽是兩種操作方式。
簽名目的1,防止數(shù)據(jù)被篡改
https可以最大限度保證傳輸層的安全,但是證書(shū)是有可能泄露的,一旦證書(shū)泄露數(shù)據(jù)就等于在裸奔。
數(shù)據(jù)到網(wǎng)關(guān)后,做負(fù)均衡通過(guò)http的方式把請(qǐng)求轉(zhuǎn)發(fā)到下游服務(wù),在轉(zhuǎn)發(fā)的過(guò)程中數(shù)據(jù)是不安全的,因?yàn)楦鞣N原因數(shù)據(jù)可能會(huì)丟失或者被篡改。
轉(zhuǎn)賬或者收款場(chǎng)景里如果收款人的卡號(hào)在數(shù)據(jù)傳輸過(guò)程中,被篡改成別人的卡號(hào),我們服務(wù)端是沒(méi)法感知到的,所以必須通過(guò)驗(yàn)簽的方式來(lái)保證數(shù)據(jù)數(shù)據(jù)一致性,不能被篡改。
2,防止接口被惡意調(diào)用。那是如何防止惡意調(diào)用的呢?加簽一般都是需要給客戶端分配業(yè)務(wù)碼和密鑰的,錯(cuò)誤的業(yè)務(wù)碼或者密鑰加簽后的值和服務(wù)端的加簽值肯定是不一樣的,長(zhǎng)時(shí)間一個(gè)接口總是驗(yàn)簽失敗,事有反常必有妖,就得引起注意了。
3,接口冪等
有些地方會(huì)用這個(gè)秘鑰作為接口冪等的判斷,也是可以的,防止同樣的參數(shù)調(diào)用多次,污染數(shù)據(jù)。
適合簽名的場(chǎng)景
簽名畢竟是影響效率的,所以一般對(duì)數(shù)據(jù)較為敏感,安全性要求極高的場(chǎng)景里使用簽名。比如金融,支付,個(gè)人信息傳輸?shù)膱?chǎng)景里比較適合。
簽名算法
最簡(jiǎn)單,也是最普遍的一般都是MD5+秘鑰的方式,這個(gè)類似于對(duì)稱加密,服務(wù)端和客戶端秘鑰都一樣,最安全的方式還是使用RSA非對(duì)稱的方式,使用公鑰加密,私鑰解密,可以充分提高安全性。