在實際開發工作中,用到接口開發,報文采用的是MD5加密方式,自己想做一個html的靜態頁面來實現報文的封裝和加密,在這個過程中就發現了js對雙引號“"”的處理不像看上去那麼簡單了。還有js替換字符串的方法。
js實現MD5加密:
相關js文件下載地址:http://download.csdn.net/detail/songylwq/7034729
<body>
<form id="formDom" action="" accept="application/json" method="post" target="_blank">
data<textarea id="taData" rows="10" cols="40" name="data">{"id":"55","type":"province"}</textarea><br/>
sign<input name="sign" id="sign" value="b217c713485ca913edef6fe87f3ba3a0" size="40"/><br/>
<input type="button" id="butSing" value="籤 名" />
<input type="submit" id="butSubmit" value="提 交" />
</form>
</body>
function signData(){
var enStr = $("#taData").text();
var hex_md5_str = hex_md5(enStr);
$("#sign").val(hex_md5_str);
}
報文格式:{"id":"1","type":"province"}
對於這個功能首先想到的是這種實現,本身實現思路沒問題,關鍵在於簽出的MD5上,字母、數字、漢字沒問題,但是報文中雙引號“ " ”等就不行了,MD5就不一樣了。
頁面輸出簽名前的報文:
<label id="enStr"></label>
$("#enStr").html(enStr);
頁面輸出沒問題,是一樣的。
首先會想到會不會是雙引號格式不同,我就將雙引號全部替換成“ \" ”再簽名,也不對。
在學習js替換時js的replace("","")方法只能替換第一個匹配字符,比如
"anbsa".replace("a","1")
輸出結果爲:“1nbsa”
所以這裏就要用到正則表達式來替換:
"ansfla".replace(new RegExp("a","g"),"1")
輸出結果爲:“1nsfl1”
本來想用這個方式替換“\"”爲“"”發現替換無效還是“{"id":"1","type":"province"}”
但是用“alert()”打印後發現了問題
打印輸出爲:“{"id":"1","type":"province"}”
問題就在這,頁面顯示爲雙引號但是js在處理時卻是轉義了所以簽名一直不一致,問題找到了就好解決了,將字符裏面的“"”替換爲雙引號,然後打印看看,ok了簽名一樣了
hex_md5(enStr.replace(new RegExp(""","g"),"\""));