應用場景
前端html輸入用戶名密碼之后,使用http傳到后台,post的內容全部是明文,用戶名和密碼通過抓包工具可以很容易獲取到,所以需要在http傳輸之前對密碼進行加密處理,php收到post內容之后進行解密,然后進行后續認證處理。
加密解密思路
逐個遍歷輸入的密碼字符串,在每個字符前后分別插入一個隨機的字符,靜態的隨機字符串通過大小寫字母和數字打亂順序所得。對於字符本身,如果存在於靜態的字符串中,那么將字符按照靜態字符串的順序后移三位,如此獲得最終加密的字符串。解密方式逆處理即可。
js加密代碼
1 function encode(_str){ 2 var staticchars = "PXhw7UT1B0a9kQDKZsjIASmOezxYG4CHo5Jyfg2b8FLpEvRr3WtVnlqMidu6cN"; 3 var encodechars = ""; 4 for(var i=0;i<_str.length;i++){ 5 var num0 = staticchars.indexOf(_str[i]); 6 if(num0 == -1){ 7 var code = _str[i]; 8 }else{ 9 var code = staticchars[(num0+3)%62]; 10 } 11 var num1 = parseInt(Math.random()*62,10); 12 var num2 = parseInt(Math.random()*62,10); 13 encodechars += staticchars[num1]+code+staticchars[num2]; 14 } 15 return encodechars; 16 }
1 function decode(_str){ 2 var staticchars = "PXhw7UT1B0a9kQDKZsjIASmOezxYG4CHo5Jyfg2b8FLpEvRr3WtVnlqMidu6cN"; 3 var decodechars = ""; 4 for(var i=1;i<_str.length;){ 5 var num0 = staticchars.indexOf(_str[i]); 6 if(num0 == -1){ 7 var code = _str[i]; 8 }else{ 9 var code = staticchars[(num0+59)%62]; 10 } 11 decodechars += code; 12 i = i+3; 13 } 14 return decodechars; 15 }
php解密代碼
1 public function decode($str){ 2 $staticchars = "PXhw7UT1B0a9kQDKZsjIASmOezxYG4CHo5Jyfg2b8FLpEvRr3WtVnlqMidu6cN"; 3 $decodechars = ""; 4 for($i=1;$i<strlen($str);){ 5 $num0 = strpos($staticchars, $str[$i]); 6 if($num0 !== false){ 7 $num1 = ($num0+59)%62; 8 $code = $staticchars[$num1]; 9 }else{ 10 $code = $str[$i]; 11 } 12 $decodechars .= $code; 13 $i+=3; 14 } 15 return $decodechars; 16 }
原密碼
admin!@#123
加密后的密碼
(插入的字符是隨機獲取的,所以加密的密碼每次都不一樣)
aQfacYtzkU64fMYe!VV@AY#KdaDZF9oV0
特別說明
上面這種加密方式只是進行了一種簡單的偽裝,通過分析JS代碼是很容易破解的,要求不高可以使用。為了規避抓包分析導致密碼泄露,可以使用https進行傳輸。