前端數據的加密和解密--對象解密的坑


作為一個前端菜雞,今天碰到一個加密解密的坑,浪費了不少時間. 為了報仇,我決定再次拿起我的小本本,君子報仇十年不晚,先記下來.

先說坑,加密解密前端工作中很常見. 之前也加密過密碼賬戶之類的,一切都順暢無比,比如:

//vue中
 mounted: function() {
    let x = encryptDes("123", this.$enkey);//加密
    let x2 = decryptDes(x, this.$enkey); //解密
    console.log(x);    
    console.log(x2);
}

輸出結果:(看吧一切都那么順利)

 

就在今天當我加密要一個"對象"的時候......出現了問題:

 

 let obj = {
      test: 123
    };
    console.log(JSON.stringify(obj));
    let x = encryptDes(JSON.stringify(obj), this.$enkey);
    let x2 = decryptDes(x, this.$enkey);
    console.log(x);
    console.log(x2);

 結果輸出了個這么個鬼東西:

 

 這不科學啊,由於菜雞是真的菜,導致我根本沒見過這鬼東西,百度完了,絲毫沒有線索,菜雞我開始懷疑人生,突然靈光一現,難道就因為菜雞我沒"對象" ? obj=null了?

問了哈旁邊后台的一個同事.說應該字符串的編碼之類的問題 ,結果再用url解碼解了下真的有結果:(JS中對URL進行轉碼與解碼)

 let obj = {
      test: 123
    };
    console.log(JSON.stringify(obj));
    let x = encryptDes(JSON.stringify(obj), this.$enkey);
    let x2 = decryptDes(x, this.$enkey);
    console.log(x);
    console.log(x2);
    console.log(unescape(x2));

果然不是obj=null的事.

附加密的封裝:

import cryptoJs from "crypto-js";

function stringToHex(str){
    var val="";
    for(var i = 0; i < str.length; i++){
      if(val == "")
        val = str.charCodeAt(i).toString(16);
      else
        val += "," + str.charCodeAt(i).toString(16);
    }
    return val;
  }

//base64加密
export const encryptBase64 = (message)=>{
  var str = cryptoJs.enc.Utf8.parse(message);
  var encryptMsg = cryptoJs.enc.Base64.stringify(str);
  return encryptMsg
}

//base64解密
export const decryptBase64 = (message)=>{
  var decryptMsg = cryptoJs.enc.Base64.parse(message);
  var parseStr = decryptMsg.toString(cryptoJs.enc.Utf8);
  return parseStr
}

// DES加密密
export const encryptDes = (message, key) => {
  message = encodeURIComponent(message)
  key = encodeURIComponent(key)
  var keyHex = cryptoJs.enc.Utf8.parse(key)
  var ivHex = cryptoJs.enc.Utf8.parse(key)
  var option = {iv: ivHex, mode: cryptoJs.mode.CBC, padding: cryptoJs.pad.Pkcs7}
  var encrypted = cryptoJs.DES.encrypt(message, keyHex, option)
  var msg = (encrypted.ciphertext.toString())
  var b=msg.toUpperCase();
  return (b)
}

// DES解密
export const decryptDes = (message, key) => {
  var keyHex = cryptoJs.enc.Utf8.parse(key)
  var ivHex = cryptoJs.enc.Utf8.parse(key)
  var decrypted = cryptoJs.DES.decrypt(
    {
      ciphertext: cryptoJs.enc.Hex.parse(message)
    },
    keyHex,
    {
      iv: ivHex,
      mode: cryptoJs.mode.CBC,
      padding: cryptoJs.pad.Pkcs7
    }
  )
  return decrypted.toString(cryptoJs.enc.Utf8)
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM