javascript加密


利用套件把字串進行加密,在一些資安要求下可能會有需要。在資料傳送前進行加密,在後端程式接收後在解密還原。

當初需要用到這個功能是在資安要求下不能使用明碼傳送帳號密碼,於是找到這款套件在傳送前進行加密處理。

使用套件crypto-js的文件與下載點
https://code.google.com/archive/p/crypto-js/
似乎是原始git的連結
https://github.com/brix/crypto-js

下面的範例使用的是aes加密
首先載入需要的js

<script src="assets/js/CryptoJS/components/core.js"></script>
<script src="assets/js/CryptoJS/rollups/aes.js"></script>
<script src="assets/js/CryptoJS/components/pad-zeropadding.js"></script>

接著是加密字串的方法,AES_key和AES_iv需換成自訂的16字元的英文或數字字串,並且在後端程式那邊有同樣一組才能解密,可能的情況最好隨機產生不同的字串發給不同使用者。
EX:2358abc087688978

var data = '想加密的字串';
var key = CryptoJS.enc.Latin1.parse('AES_key');
var iv = CryptoJS.enc.Latin1.parse('AES_iv');
var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv});
encrypted=encodeURIComponent(encrypted);
//encrypted就是加密後的結果

傳到後端程式後使用對應的解密方法即可
以下是PHP範例

//ase解密用
class Aes_fun
{
	public function __construct()
	{
	}
	//php7或以上版本
	//var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv});
	public static function encrypt($key, $iv, $data)
    {
        return openssl_encrypt($data,'aes-128-cbc',$key,false,$iv);
    }
    public static function decrypt($key, $iv, $data)
    {
		$decode = base64_decode($data);
        return openssl_decrypt($decode,'AES-128-CBC',$key,OPENSSL_RAW_DATA,$iv);
    }

  //php5處理方法
	//舊版php 
    //javascript需要調整加密函數
    //var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
	public static function encrypt_php5($key, $iv, $data)
    {
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, "", MCRYPT_MODE_CBC, "");
        mcrypt_generic_init($td, $key, $iv);
        $encrypted = mcrypt_generic($td, $data);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return base64_encode($encrypted);
    }
    public static function decrypt_php5($key, $iv, $data)
    {
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,"",MCRYPT_MODE_CBC,"");
        mcrypt_generic_init($td, $key, $iv);
        $decode = base64_decode($data);
        $dencrypted = mdecrypt_generic($td, $decode);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);

        return $dencrypted;
    }
}

//呼叫對應的函數解密
$asefun = new Aes_fun();
$asefun->decrypt(AES_key,AES_iv,urldecode(trim($_POST['data'])));
Tags : javascript php