Error-Javascript:Uncaught Error: Malformed UTF-8 data at Object.stringify (crypto-js.js:478) at W...

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.返回顶部
一、

通常状况下,不多会在前端进行加解密的操做,由于没有太大的必要性,前端的代码是很容易看到的,即便这样,我以为仍是有比较处理一下的,至少不让别人一眼就看到信息前端

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

按照官方的例子,以下chrome

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 datanpm

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

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.返回顶部
 
3.返回顶部
 
4.返回顶部
 
5.返回顶部
 
 
6.返回顶部
 
warn 做者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。
相关文章
相关标签/搜索