下载地址:
https://github.com/emn178/js-sha1
https://github.com/beatgammit/base64-js
https://github.com/emn178/js-md5
https://github.com/ricmoo/aes-js
https://github.com/brix/crypto-js
1、base64加密
在页面中引入base64.js文件,调用方法为:
≮!DOCTYPE HTML≯
≮html≯
≮head≯
≮meta charset="utf-8"≯
≮title≯base64加密≮/title≯
≮script type="text/javascript" src="base64.js"≯≮/script≯
≮script type="text/javascript"≯
var b = new Base64();
var str = b.encode("admin:admin");
alert("base64 encode:" + str);
//解密
str = b.decode(str);
alert("base64 decode:" + str);
≮/script≯
≮/head≯
≮body≯
≮/body≯
≮/html≯
2、md5加密
在页面中引用md5.js文件,调用方法为
≮!DOCTYPE HTML≯
≮html≯
≮head≯
≮meta charset="utf-8"≯
≮title≯md5加密≮/title≯
≮script type="text/ecmascript" src="md5.js"≯≮/script≯
≮script type="text/javascript"≯
var hash = hex_md5("123dafd");
alert(hash)
≮/script≯
≮/head≯
≮body≯
≮/body≯
≮/html≯
3、sha1加密
据说这是最安全的加密
页面中引入sha1.js,调用方法为
≮!DOCTYPE HTML≯
≮html≯
≮head≯
≮meta charset="utf-8"≯
≮title≯sha1加密≮/title≯
≮script type="text/ecmascript" src="sha1.js"≯≮/script≯
≮script type="text/javascript"≯
var sha = hex_sha1('mima123465')
alert(sha)
≮/script≯
≮/head≯
≮body≯
≮/body≯
≮/html≯
首先在项目中引入对应的加密文件,我们用的是AES,同时用RequireJS来加载JS,在配置中声明路径:
require.config({
baseUrl: "/Public/Home/Js/lib",
paths: {
hzbAES:'../module/hzb.AES'
}
});
首先把加密解密封装好为一个模块
//模块初始化
var init=function () {
key = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(ym.hezubao).toString());
iv = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(key).toString().substr(0,16));
}
function encrypt(data) {
var encrypted='';
if(typeof(data)=='string')
{
encrypted = CryptoJS.AES.encrypt(data,key,{
iv : iv,
mode : CryptoJS.mode.CBC,
padding : CryptoJS.pad.ZeroPadding
});
}else if(typeof(data)=='object'){
data = JSON.stringify(data);
encrypted = CryptoJS.AES.encrypt(data,key,{
iv : iv,
mode : CryptoJS.mode.CBC,
padding : CryptoJS.pad.ZeroPadding
})
}
return encrypted.toString();
}
/*AES解密
* param : message 密文
* return : decrypted string 明文
*/
function decrypt(message) {
decrypted='';
decrypted=CryptoJS.AES.decrypt(message,key,{
iv : iv,
mode : CryptoJS.mode.CBC,
padding : CryptoJS.pad.ZeroPadding
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
解释一下代码:
我们加密的模式选的是CBC的,然后填充模式是填充0,这个是前后台约定的,请谨慎。加密秘钥要求是32位长字符串(通过md5加密确保32位,算法限制),iv初始化向量是16位长度的字符串。这两个东西不懂的话,看看AES加密的条件。
要注意的是,在加密完成后的字符串是经过Base64加密的,也就是说,后台解密模块必须要求考虑字符编码问题,这个由项目实际来决定。可以把他先转出UTF8的然后再传递给后台。我这里后台是介绍Base64加密后的,所以就不用转码了。
解密之后要转成UTF8喔,如果后台给的数据是JSON的话,要用JSON.parse()一下才能用。
在代码中调用
require(['hzbAES'], function(hzbAES){
var jsonData={'id':2,'username':'春天的熊'};//json格式数据(加密支持json格式和字符串格式)
$('#btn_test').click(function () {
var encrypt=hzbAES.encrypt(jsonData);
console.log('前台发过去的数据:'+encrypt);//已加密
$.getJSON(UrlGenerator.url(2,'Home','Index','test'),{'data':encrypt},function (data) {
if(!data['error'])
{
var decrypt=JSON.parse(hzbAES.decrypt(data['data']));
console.log('后台发过来的数据:');//已解密
console.log(decrypt);
}else{
console.log(data['error']);
}
})
});
});
将加密方法统一封装
sec= { cfg: { iv: CryptoJS.enc.Hex.parse('0000000000000000'),//填充模式0,iv初始化向量是16位长度的字符串,前后端商量约定 mode: CryptoJS.mode.CBC,//加密模式 padding: CryptoJS.pad.Pkcs7 }, encrypt: function (str, key) { var k = CryptoJS.enc.Utf8.parse(key); return CryptoJS.AES.encrypt(str, k, this.cfg).toString(); }, decrypt: function (str, key) { var k = CryptoJS.enc.Utf8.parse(key); return CryptoJS.enc.Utf8.stringify(CryptoJS.AES.decrypt(str, k, this.cfg)); }, md5: function (str) { return CryptoJS.MD5(str).toString().toUpperCase(); }, genVldCode: function (str, key) { return this.encrypt(this.md5(str + key), key) } };
调用:
var str = sec.decrypt(str, key);解密调用