事實是這樣的,我有個介面,這個介面不能被篡改,於是想到了比較簡單的md5對url地址參數進行加密,把這個密碼當成是sign,然後服務端收到請求後,使用相同演算法也生成sign,兩個sign相同就正常沒有被篡改過。 問題的出現 介面中的參數包括userId,extUserId,時間,其中extUserI ...
事實是這樣的,我有個介面,這個介面不能被篡改,於是想到了比較簡單的md5對url地址參數進行加密,把這個密碼當成是sign,然後服務端收到請求後,使用相同演算法也生成sign,兩個sign相同就正常沒有被篡改過。
問題的出現
- 介面中的參數包括userId,extUserId,時間,其中extUserId字元編碼,中間會有+這種符號
- 有些用戶使用簽名介面正常
- 有一些用戶總顯示簽名失敗
問題原因
- 因為有些用戶的extUserId中包括了url上的特殊字元,它不能正常在在url上傳輸,必須進行urlEncode編碼才行,這一點非常容易被忽略;程式中一般不需要手動urlDecode解碼,都是由框架幫我們實現的。
- 下麵整理了一些url上需要編碼的字元:
+
URL中+表示空格 十六進位: %2B/
分離目錄和子目錄 十六進位 : %2F?
分離實際的URL和參數 十六進位: %3F%
特殊字元 十六進位: %25#
表示書簽 十六進位: %23&
URL中指定參數間的分隔符 十六進位: %26=
URL中指定參數的值 十六進位:%3D空格
URL中的空格可以用+號或者編碼 十六進位 : %20
url在簽名時一般這樣處理
sign=md5(userId+extUserId+simpleDateFormat.format(new Date()) + SECRET).toUpperCase();
?extUserId=URL.Encode(extUserId)&sign=sign
註意:sign中是接收的參數,它不需要Encode,應該框架已經幫我們做了;而向下傳遞的url參數extUserId是需要手動Encode的。
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!