為了保證http請求數(shù)據(jù)的安全性和防篡改性。我們通常要對請求參數(shù)進(jìn)行一些加密。 加密規(guī)則可以根據(jù)雙方接口協(xié)商定義。這里舉一個(gè)常用的加密協(xié)議例子。
接口協(xié)議中通常會(huì)提供一個(gè) appKey作為唯一的標(biāo)識(shí)。 appSecret作為接入密鑰。 例如:appkey=hh appSecret=39ertfefdsg406c7c36592d42022aaecc 請求路徑 http://www.example.com/login 請求參數(shù) appKey hh 合作方平臺(tái)標(biāo)識(shí) username 用戶名 passWord 密碼 time Unix時(shí)間戳(10位) sign 簽名串
將篩選的參數(shù)按照第一個(gè)字符的鍵值A(chǔ)SCII碼遞增排序(字母升序排序),如果遇到相同字符則按照第二個(gè)字符的鍵值A(chǔ)SCII碼遞增排序,以此類推。 將排序后的參數(shù)與其對應(yīng)值,組合成“參數(shù)=參數(shù)值”的格式,并且把這些參數(shù)用&字符連接起來,此時(shí)生成的字符串為待簽名字符串 生成簽名 sign = md5(待簽名字符串) 示例 例如: sign = md5(待簽串) 參數(shù)表為: appKey=hs, username=lzl, password=88fsdfgsff8fd9ssg99 time=1432432234 待簽名字符串為(取排序后的結(jié)果,這里key不參與排序): appKey=hh&password=HG20170113140431206&time=1423212323&key=密鑰
我們根據(jù)加密要求,把要傳送的字段進(jìn)行排序和MD5加密。將加密后的結(jié)果和傳輸?shù)淖侄我徊⑺瓦^去。 appKey=hh&password=HG20170113140431206&time=1423212323&key=密鑰&sign=簽名串。 驗(yàn)證方式: 如何保證這條http請求能夠正常相應(yīng)數(shù)據(jù)呢?提供接口方,也是根據(jù)傳輸?shù)淖侄芜M(jìn)行排序和MD5加密。將加密后的結(jié)果verifySign與sign進(jìn)行 比較。如果相同,就說明是一個(gè)正常的請求。反之,就是以非法請求。 代碼示例:
public class MD5Utils { /** * 參數(shù)簽名加密 * @param parameters * @param secret * @return */ public static String signRequest(TreeMap<String,String> parameters,String secret,String charset){ TreeMap<String, String> treeMap = new TreeMap<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); treeMap = (TreeMap<String, String>) parameters; System.out.新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注