javascript對(duì)URL中的參數(shù)進(jìn)行簡(jiǎn)單加密處理
創(chuàng)新互聯(lián)從2013年成立,公司以網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、系統(tǒng)開發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計(jì)等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶成百上千,涉及國(guó)內(nèi)多個(gè)省份客戶。擁有多年網(wǎng)站建設(shè)開發(fā)經(jīng)驗(yàn)。為企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計(jì)、宣傳推廣等服務(wù)。 通過專業(yè)的設(shè)計(jì)、獨(dú)特的風(fēng)格,為不同客戶提供各種風(fēng)格的特色服務(wù)。
javascript的api本來就支持Base64,因此我們可以很方便的來進(jìn)行編碼和解碼。
var encodeData = window.btoa("name=xiaomingage=10")//編碼
var decodeData = window.atob(encodeData)//解碼。
下面來個(gè)具體的例子來說明如何對(duì)url中參數(shù)進(jìn)行轉(zhuǎn)碼,并取得解碼后的參數(shù)
假如要跳轉(zhuǎn)的url = "stu_info.html?name=xiaomingage=10"
轉(zhuǎn)碼:url = "stu_info.html?"+window.btoa("name=xiaomingage=10");
跳轉(zhuǎn):window.open(url)或者window.locaton.href = url;
解碼:解碼時(shí)我們首先要從url中獲得參數(shù)列表,
我們可以通過var paramsString = window.location.search來獲取url中?號(hào)開始的內(nèi)容(url的查詢部分)即"?name=xiaomingage=10";
然后去掉?號(hào) paramsString? = paramsString.substring(1) //"name=xiaomingage=10"
去掉 paramsString? = paramsString.split("");//["name=xiaoming","age=10"]
需要指出的是 window.btoa這中編碼方式不能直接作用于Unicode字符串。只能將ascci字符串或二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成Base64編碼過的字符串。如果要對(duì)Unicode字符進(jìn)行編碼可以將做如下轉(zhuǎn)換。
var encodeData = window.btoa(window.encodeURIComponent("name=小明age=10"))//編碼
var decodeData = window.decodeURIComponent(window.atob(encodeData))//解碼。
獲取url參數(shù)
//獲取url參數(shù)
function getQueryString(name) {?
var reg = new RegExp("(^|)" + name + "=([^]*)(|$)", "i");
var params = window.location.search.substr(1);
params = window.decodeURIComponent(window.atob(params));
var r = params.match(reg);?
if (r != null) {
return decodeURI(r[2]);
}
return null;
}
獲取公鑰串
var encryptionJs = {
//公鑰串
public_key :? ?
'963D2956DC25DC34504BFDA93C1485DFAEB776929086D080593EDB770622811EECBA042A5E03B317722659ED951A9BF5B934E447C133F895FD906EDFE2E0436AD227483D7810AC3A5B028CB66C4DCC147086914665AD72C8B11F28EAE2F16B7678CF9AC9D17432395E37A5B998C6C569C7F9252F420CDCD7EB0E875CAF689197',
//公鑰長(zhǎng)度
public_length : "10001",
/**
* 加密串
× str 加密變量
* @Return bool
*/
edai_encryption:function(str){
var rsa = new RSAKey();
rsa.setPublic(encryptionJs.public_key, encryptionJs.public_length);
var res = rsa.encrypt(str);
return res;
},
/**
* 加密
*/
form_encryption:function(formDataStr){
/*datas=formDataStr.split("");
var real_name='';
var postStr = '';
$.each(datas,function(i,v){
var vv=v.split("=");
if(vv[0]=='real_name'){
real_name = 'real_name='+encryptionJs.edai_encryption(vv[1]);
}else{
if(postStr){
postStr+=''+vv[0]+'='+(vv[1]?vv[1]:'');
}else{
postStr=vv[0]+'='+(vv[1]?vv[1]:'');
}
}
});
postStr = real_name+'postData='+encryptionJs.edai_encryption(postStr);*/
datas=formDataStr.split("");
var postArr = new Array();
$.each(datas,function(i,v){
var vv=v.split("=");
postArr.push(vv[0]+'='+(vv[1]?encryptionJs.edai_encryption(vv[1]):''));
});
postStr = postArr.join('');
return postStr;
}
}
參考:RSA JS 在這個(gè)網(wǎng)頁里讀取
很多JavaScript在加密后是不可以再解密的,JavaScript加密相當(dāng)于是字符串加密。JavaScript加密被叫做加密混淆,例如:sha1。
一:最簡(jiǎn)單的加密解密
二:轉(zhuǎn)義字符"\"的妙用
三:使用Microsoft出品的腳本編碼器Script. Encoder來進(jìn)行編碼 (自創(chuàng)簡(jiǎn)單解碼)
四:任意添加NUL空字符(十六進(jìn)制00H) (自創(chuàng))
五:無用內(nèi)容混亂以及換行空格TAB大法
六:自寫解密函數(shù)法
七:錯(cuò)誤的利用 (自創(chuàng))
在做網(wǎng)頁時(shí)(其實(shí)是網(wǎng)頁木馬呵呵),最讓人煩惱的是自己辛辛苦苦寫出來的客戶端IE運(yùn)行的JAVASCRIPT代碼常常被別人輕易的拷貝,實(shí)在讓自己的心里有點(diǎn)不是滋味,要知道自己寫點(diǎn)東西也挺累的......^*^
我們清楚地認(rèn)識(shí)到因?yàn)镴AVASCRIPT代碼是在IE中解釋執(zhí)行,要想絕對(duì)的保密是不可能的,我們要做的就是盡可能的增大拷貝者復(fù)制的難度,讓他知難而退(但愿~!~),下面我結(jié)合自己這幾年來的實(shí)踐,及個(gè)人研究的心得,和大家一起來探討一下網(wǎng)頁中JAVASCRIPT代碼的加密解密技術(shù)。
加密在我們前端的開發(fā)中也是經(jīng)常遇見的。本文只把我們常用的加密方法進(jìn)行總結(jié)。不去糾結(jié)加密的具體實(shí)現(xiàn)方式(密碼學(xué),太龐大了)。
常見的加密算法基本分為這幾類,
RSA加密:RSA加密算法是一種非對(duì)稱加密算法。在公開密鑰加密和電子商業(yè)中RSA被廣泛使用。(這才是正經(jīng)的加密算法)
非對(duì)稱加密算法:非對(duì)稱加密算法需要兩個(gè)密鑰:公開密鑰(publickey:簡(jiǎn)稱公鑰)和私有密鑰(privatekey:簡(jiǎn)稱私鑰)。公鑰與私鑰是一對(duì),如果用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私鑰才能解密。因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對(duì)稱加密算法。
DES全稱為Data Encryption Standard,即數(shù)據(jù)加密標(biāo)準(zhǔn),是一種使用密鑰加密的塊算法
DES算法的入口參數(shù)有三個(gè):Key、Data、Mode。其中Key為7個(gè)字節(jié)共56位,是DES算法的工作密鑰;Data為8個(gè)字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode為DES的工作方式,有兩種:加密或解密。
AES這個(gè)標(biāo)準(zhǔn)用來替代原先的DES
DES/AES我們合并在一起介紹其用法和特點(diǎn)
Base64是一種用64個(gè)字符來表示任意二進(jìn)制數(shù)據(jù)的方法。base64是一種編碼方式而不是加密算法。只是看上去像是加密而已(嚇唬人)。
是的,解密函數(shù)為:
window.btoa("test");//"dGVzdA=="
window.atob("dGVzdA==");//"test"
為什么要使用Base64加密呢?
Base64編碼的作用:由于某些系統(tǒng)中只能使用ASCII字符。Base64就是用來將非ASCII字符的數(shù)據(jù)轉(zhuǎn)換成ASCII字符的一種方法。它使用下面表中所使用的字符與編碼。
而且base64特別適合在http,mime協(xié)議下快速傳輸數(shù)據(jù)。
base64其實(shí)不是安全領(lǐng)域下的加密解密算法。雖然有時(shí)候經(jīng)常看到所謂的base64加密解密。其實(shí)base64只能算是一個(gè)編碼算法,對(duì)數(shù)據(jù)內(nèi)容進(jìn)行編碼來適合傳輸。雖然base64編碼過后原文也變成不能看到的字符格式,但是這種方式很初級(jí),很簡(jiǎn)單。
Base64編碼方法要求把每三個(gè)8Bit的字節(jié)轉(zhuǎn)換為四個(gè)6Bit的字節(jié),其中,轉(zhuǎn)換之后的這四個(gè)字節(jié)中每6個(gè)有效bit為是有效數(shù)據(jù),空余的那兩個(gè) bit用0補(bǔ)上成為一個(gè)字節(jié)。因此Base64所造成數(shù)據(jù)冗余不是很嚴(yán)重,Base64是當(dāng)今比較流行的編碼方法,因?yàn)樗幤饋硭俣瓤於液?jiǎn)單。