• Error-Javascript:Uncaught Error: Malformed UTF-8 data at Object.stringify (crypto-js.js:478) at WordArray.init.toString (crypto-js.js:215)


    ylbtech-Error-Javascript:Uncaught Error: Malformed UTF-8 data     at Object.stringify (crypto-js.js:478)     at WordArray.init.toString (crypto-js.js:215)  
    1.返回顶部
    1、

    一般情况下,很少会在前端进行加解密的操作,因为没有太大的必要性,前端的代码是很容易看到的,即使这样,我觉得还是有比较处理一下的,至少不让别人一眼就看到信息

    我使用localStorage存储了一些用户的用户名昵称等的信息,通过crypto-js进行加解密处理,这里我选用了AES加密算法对json对象数据进行处理

    按照官方的例子,如下

    var CryptoJS = require("crypto-js");
     
    var data = [{id: 1}, {id: 2}]
     
    // Encrypt
    var ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), 'secret key 123');
     
    // Decrypt
    var bytes  = CryptoJS.AES.decrypt(ciphertext.toString(), 'secret key 123');
    var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
     
    console.log(decryptedData);

    以上代码在chrome里运行没什么问题,可是在Safari的时候报了malformed utf-8 data

    可能是前端加解密的场景比较少,搜到若干报这个错的,但是鲜有解决方法,其中有一个说加密数据不是8的整数倍就会报上述错误
    解决方法:将数据加密后,再进行base64进行处理

      let newUserInfo = {nickname:'hello',email:'abc123@qq.com'};
      //加密数据
      let encJson = cryptoJS.AES.encrypt(JSON.stringify(newUserInfo), 'aes').toString();
      //对加密数据进行base64处理, 原理:就是先将字符串转换为utf8字符数组,再转换为base64数据
      let encData = cryptoJS.enc.Base64.stringify(cryptoJS.enc.Utf8.parse(encJson));
      localStorage.setItem('userInfo', encData);
    
      //将数据先base64还原,再转为utf8数据
      let decData = cryptoJS.enc.Base64.parse(localStorage.getItem('userInfo')).toString(cryptoJS.enc.Utf8);
      //解密数据
      let decJson = cryptoJS.AES.decrypt(decData, 'aes').toString(cryptoJS.enc.Utf8);
      userInfo = JSON.parse(decJson);
      
      console.log(userInfo);

    以上,在safari,chrome,firefox运行没问题

    2、
    2.返回顶部
     
    3.返回顶部
     
    4.返回顶部
     
    5.返回顶部
     
     
    6.返回顶部
     
    warn 作者:ylbtech
    出处:http://ylbtech.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    懒加载与预加载
    Javascript之 Ajax 与 JSON
    Q&A:为什么prototype中的方法不能赋值给变量,再调用?
    Javascript之 浅克隆 与 深克隆
    Javascript之 __proto__ 与 prototype
    React入门(二)—— Props属性
    React入门(一)—— State属性
    Flask调用layer-iframe后,如何从服务器端关闭弹出窗
    Python从入门到项目实践(明日科技 吉林大学出版社)
    从实例到数理来解析感知机学习算法(PLA)
  • 原文地址:https://www.cnblogs.com/storebook/p/12693142.html
Copyright © 2020-2023  润新知