JS 實現MD5加密,以及發現的JS對字元的處理、替換等
阿新 • • 發佈:2019-01-10
在實際開發工作中,用到介面開發,報文采用的是MD5加密方式,自己想做一個html的靜態頁面來實現報文的封裝和加密,在這個過程中就發現了js對雙引號“"”的處理不像看上去那麼簡單了。還有js替換字串的方法。
js實現MD5加密:
<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"),"\""));