在本地存储数据的方法有cookie、sessionStorage、localStorage。这些数据存在客户端,如果用明文存储会存在一定的风险,项目实际应用中需要对数据进行加密。
本例使用crypto-js进行AES算法加密解密。

AES介绍

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:

本地存数据加解密 - 图1
推荐一篇AES加密算法的详细介绍与实现,讲的很详细。

安装crypto-js

要用 AES 算法加密,首先我们要引入 crypto-js ,crypto-js 是一个纯 javascript 写的加密算法类库 ,可以非常方便地在 javascript 进行 MD5、SHA1、SHA2、SHA3、RIPEMD-160 哈希散列,进行 AES、DES、Rabbit、RC4、Triple DES 加解密。下载安装
npm install crypto-js —save** **

定义加解密crypto.js

在utils文件夹下,创建crypto.js文件,编写加密解密方法。

  1. import CryptoJS from 'crypto-js'
  2. // 默认的 KEY 与 iv 如果没有给
  3. const KEY = CryptoJS.enc.Utf8.parse("1234567890123456");
  4. const IV = CryptoJS.enc.Utf8.parse('1234567890123456');
  5. /**
  6. * AES加密 :字符串 key iv 返回base64
  7. */
  8. export function Encrypt(word, keyStr, ivStr) {
  9. let key = KEY
  10. let iv = IV
  11. if (keyStr) {
  12. key = CryptoJS.enc.Utf8.parse(keyStr);
  13. iv = CryptoJS.enc.Utf8.parse(ivStr);
  14. }
  15. let srcs = CryptoJS.enc.Utf8.parse(word);
  16. var encrypted = CryptoJS.AES.encrypt(srcs, key, {
  17. iv: iv,
  18. mode: CryptoJS.mode.CBC,
  19. padding: CryptoJS.pad.ZeroPadding
  20. });
  21. return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
  22. }
  23. /**
  24. * AES 解密 :字符串 key iv 返回base64
  25. */
  26. export function Decrypt(word, keyStr, ivStr) {
  27. let key = KEY
  28. let iv = IV
  29. if (keyStr) {
  30. key = CryptoJS.enc.Utf8.parse(keyStr);
  31. iv = CryptoJS.enc.Utf8.parse(ivStr);
  32. }
  33. let base64 = CryptoJS.enc.Base64.parse(word);
  34. let src = CryptoJS.enc.Base64.stringify(base64);
  35. var decrypt = CryptoJS.AES.decrypt(src, key, {
  36. iv: iv,
  37. mode: CryptoJS.mode.CBC,
  38. padding: CryptoJS.pad.ZeroPadding
  39. });
  40. var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  41. return decryptedStr.toString();
  42. }

定义存储文件storage.js

定义一个工具storage.js,封装setStore、getStore、removeStore方法。

  1. import { Encrypt, Decrypt } from './crypto';
  2. const storage = window.sessionStorage;
  3. // 对存储的value值加密
  4. const serialize = val => Encrypt(JSON.stringify(val));
  5. // 对存储的value解密
  6. const deserialize = val => {
  7. if (!val) {
  8. return null;
  9. }
  10. let res = '';
  11. try {
  12. res = Decrypt(val);
  13. } catch (e) {
  14. res = val;
  15. }
  16. res !== undefined ? res : val;
  17. return (res = JSON.parse(res));
  18. };
  19. export const setStore = (key, value) => {
  20. storage.setItem(key, serialize(value));
  21. };
  22. export const removeStore = key => {
  23. storage.removeItem(key);
  24. };
  25. export const getStore = key => deserialize(storage.getItem(key));

在Login页面使用

  1. import { setStore, getStore, removeStore } from "./utils/storage.js";
  2. export default{
  3. beforeRouteEnter(to, from, next) {
  4. if (getStore("username")) {
  5. setStore("username", true); // username用户已经登录
  6. } else {
  7. setStore("username", false);
  8. }
  9. next();
  10. },
  11. }

在Logout页面清除数据

  1. removeStore("username")