一 簽名設計
1.1簽名生成的步驟如下:
-
參數名ASCII碼從小到大排序(字典序)
- 案例
- buid=12&accoutid=0 —> accoutid=0&buid=12
- 案例
-
請求參數使用URL鍵值對的格式(key1=value1&key2=value2…)拼接成字符串st1
- 案例
- st1=“accoutid=0&buid=12”;
- 案例
-
拼接API密鑰st2
- 案例
- st2=st1+"&key=“商戶平臺的密鑰”
- 案例
-
獲取簽名
- 案例
- psign=MD5(st2)=“xxxx”
- 案例
-
最終發送的數據
- 案例
- accoutid=0&buid=12&psign=xxxx
- 案例
1.2最終發送的數據
key1:value1
key2:value2
time:請求的時間戳(毫秒)
psign:xxxx
1.3注意點:
- 如果參數的值爲空不參與簽名
- 參數名ASCII碼從小到大排序
- 參數名區分大小寫
- 用戶的請求參數必須帶上時間戳,參數名稱time
1.4測試工具
在線md5計算:https://oktools.net/hash
1.5操作截圖
- 請求參數:time=1569728170000&userId=1111
- 參數名ASCII碼從小到大排序,拼接API密鑰st2,獲取簽名
- 測試的商戶平臺的密鑰:xxxxoooo
- 測試的商戶平臺的密鑰:xxxxoooo
2 簽名加密設計
- 使用公鑰對psign加密
- 測試公鑰:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJWRN/d5SnaLyniXA9XObOYS5wDzfuR1Mw/o010mrMOI2mauWlYHrQyTjffJuWy5K+1YLvdq+6SoW48PnlHpPmECAwEAAQ==
2.1操作截圖
3 最終發送的數據
time=1569728170000&userId=1111&psign=F2UyJKhmWS51M0tF5oxetSGVQAZGZ8MeZ3TCp+2LR1kvKW1QBbUe/eBXSb2nYobjXJOROGOGEpk1d0qiMdlFkg==
二 數據加密(涉及加簽)設計
客戶端
- 對所有的參數加簽psign,具體看簽名設計
- 數據防篡改
- 使用公鑰對psign加密(非對稱加密)
- 防止惡意用戶破解,獲取到簽名的key(商戶平臺的密鑰)
服務端
- 獲取psign的hashcode,對比redis服務器中是否存在,存在就不執行,過期時間60分鐘
- 防止惡意用戶,截取到我們的網絡請求,做重複提交(間隔時間重複提交)
- hashcode: redis的處理速度最快的方式(redis key 設計)
- 使用私鑰對psign解密,解密失敗不執行
- 獲取真正的簽名real_psign
- 使用psign驗證防篡改,篡改不執行
- 使用請求參數生成簽名(按照簽名規則)
- 對比real_psign簽名,看2個簽名是否相等
- 相等:數據沒有篡改
- 不相等:數據別篡改了
- 解析time和服務器當前服務器時間,間隔10分鐘以上的不執行
- 第二次防止惡意用戶,截取到我們的網絡請求,做重複提交(間隔60分鐘以上重複提交),因爲redis保存的緩存,過期時間是60分鐘。如果沒有做這個處理,惡意用戶可以截取網絡請求, 間隔60分鐘以後做重複提交。
三具體代碼實現
https://blog.csdn.net/zhou920786312/article/details/101691311 私密,不公開