如何使用 Vuex 插件来实现状态的加密存储?

简介: 如何使用 Vuex 插件来实现状态的加密存储?

要使用 Vuex 插件实现状态的加密存储,可以结合持久化插件(如 vuex-persistedstate)和加密工具(如 crypto-js),在状态持久化到本地存储前进行加密,读取时再解密。以下是具体实现步骤:

1. 安装依赖

需要安装持久化插件和加密库:

npm install vuex-persistedstate crypto-js --save
# 或
yarn add vuex-persistedstate crypto-js

2. 实现加密存储插件

创建一个自定义插件,结合持久化和加密逻辑:

import { set, get } from 'vuex-persistedstate';
import CryptoJS from 'crypto-js';

// 加密密钥(实际项目中建议从环境变量获取)
const SECRET_KEY = 'your-secret-key-123'; // 密钥长度建议 16/24/32 位

// 加密函数
const encrypt = (data) => {
  return CryptoJS.AES.encrypt(JSON.stringify(data), SECRET_KEY).toString();
};

// 解密函数
const decrypt = (ciphertext) => {
  const bytes = CryptoJS.AES.decrypt(ciphertext, SECRET_KEY);
  return JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
};

// 自定义存储引擎(集成加密解密)
const encryptedStorage = {
  getItem: (key) => {
    const value = localStorage.getItem(key);
    if (!value) return null;
    // 读取时解密
    return decrypt(value);
  },
  setItem: (key, value) => {
    // 存储时加密
    const encryptedValue = encrypt(value);
    localStorage.setItem(key, encryptedValue);
  },
  removeItem: (key) => {
    localStorage.removeItem(key);
  }
};

// 创建加密持久化插件
export const createEncryptedPersistedState = (options = {}) => {
  return set({
    ...options,
    storage: encryptedStorage // 使用自定义加密存储引擎
  });
};

3. 在 Vuex 中使用加密插件

在 store 中引入并应用上述加密插件,实现状态的加密存储:


import Vue from 'vue';
import Vuex from 'vuex';
import { createEncryptedPersistedState } from './plugins/encryptedStorage';

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    user: {
      id: 1,
      name: 'John Doe',
      token: 'sensitive-token-123' // 需要加密的敏感信息
    },
    count: 0
  },
  mutations: {
    setUser(state, user) {
      state.user = user;
    },
    increment(state) {
      state.count++;
    }
  },
  // 使用加密持久化插件
  plugins: [
    createEncryptedPersistedState({
      key: 'encrypted-vuex-state', // 存储的 key 名称
      // 指定需要加密存储的状态(可选,默认全部)
      reducer: (state) => ({
        user: state.user // 只加密存储 user 信息
      })
    })
  ]
});

export default store;

4. 关键实现说明

  • 加密逻辑:使用 crypto-js 的 AES 加密算法,将状态数据序列化为字符串后加密,存储到 localStorage
  • 解密逻辑:读取数据时先解密,再反序列化为原始状态格式,确保 Vuex 能正确恢复状态。
  • 自定义存储引擎:通过实现 getItem/setItem/removeItem 方法,替换 vuex-persistedstate 默认的存储行为,嵌入加密解密步骤。

5. 安全性增强建议

  1. 密钥管理
    实际项目中,密钥(SECRET_KEY)不应硬编码在代码中,建议从后端接口或环境变量(如 .env 文件)动态获取,降低泄露风险。

  2. 加密算法选择
    示例使用 AES 算法(对称加密),适合前端场景。若需更高安全性,可结合非对称加密(如 RSA),但会增加复杂度。

  3. 敏感数据过滤
    通过 reducer 配置只加密敏感状态(如用户信息、令牌),非敏感数据(如计数器)可跳过加密,提升性能。

  4. 防止篡改
    可额外添加数据校验(如哈希值),验证存储的数据是否被篡改:

    // 加密时添加哈希
    const encrypt = (data) => {
         
      const hash = CryptoJS.SHA256(JSON.stringify(data) + SECRET_KEY).toString();
      return CryptoJS.AES.encrypt(JSON.stringify({
          data, hash }), SECRET_KEY).toString();
    };
    
    // 解密时验证哈希
    const decrypt = (ciphertext) => {
         
      const bytes = CryptoJS.AES.decrypt(ciphertext, SECRET_KEY);
      const {
          data, hash } = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
      const verifyHash = CryptoJS.SHA256(JSON.stringify(data) + SECRET_KEY).toString();
      if (hash !== verifyHash) throw new Error('数据被篡改');
      return data;
    };
    

通过这种方式,Vuex 状态在本地存储中会以加密形式存在,有效保护敏感数据,同时保持状态持久化的功能。

目录
相关文章
|
存储 安全 开发工具
oss加密存储
阿里云OSS为数据安全提供多种加密机制,包括服务器端的SSE-S3(AES-256透明加密)、SSE-C(用户管理密钥)和CSE-KMS(结合KMS进行密钥管理)。此外,OSS支持客户端加密SDK和HTTPS传输加密,确保数据在传输和存储时的安全。通过ACL、Bucket策略和访问密钥身份验证,实现权限控制与身份验证,全方位保障用户数据的安全性和隐私。用户可按需选择适合的加密方式。
724 2
|
存储 前端开发 中间件
react+koa如何进行登录时密码的加密解密和存储到数据库
react+koa如何进行登录时密码的加密解密和存储到数据库
|
20天前
|
存储 前端开发 数据安全/隐私保护
如何使用 Pinia 插件来实现状态的加密存储?
如何使用 Pinia 插件来实现状态的加密存储?
244 123
|
10月前
|
存储 监控 前端开发
如何实现前端框架数据驱动方式的数据加密存储?
实现前端框架数据驱动方式的数据加密存储需要综合考虑多个因素,包括加密算法的选择、密钥管理、传输安全、服务器端处理等。通过合理的设计和实施,能够有效提高数据的安全性,保护用户的隐私和敏感信息。但需要注意的是,前端加密存储不能完全替代后端的安全措施,后端的安全防护仍然是不可或缺的。
264 53
|
存储 NoSQL 数据库
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
这篇文章讲述了在分布式微服务系统中添加用户注册和登录功能的过程,重点介绍了用户注册时通过远程服务调用第三方服务获取短信验证码、使用Redis进行验证码校验、对密码进行MD5加密后存储到数据库,以及用户登录时的远程服务调用和密码匹配校验的实现细节。
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
171 2
|
10月前
|
存储 前端开发 安全
如何确保前端框架数据驱动方式的数据加密存储的兼容性?
确保前端框架数据驱动方式的数据加密存储的兼容性需要综合考虑多个因素,通过充分的评估、测试、关注和更新,以及与其他技术的协调配合,来提高兼容性的可靠性,为用户提供稳定和安全的使用体验。
187 52
|
存储 算法 Java
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
这篇文章详细介绍了在Java项目中如何使用MD5算法对用户密码进行加密存储和登录验证,包括加入依赖、编写MD5工具类、注册时的密码加密和登录时的密码验证等步骤,并通过示例代码和数据库存储信息展示了测试效果。
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
|
存储 安全 数据库
Uno Platform 安全数据存储秘籍大公开!加密、存储、读取全攻略,让你的数据固若金汤!
在软件开发中,安全的数据存储至关重要。本文介绍如何在跨平台开发框架 Uno Platform 中实现安全数据存储,包括选择合适的数据存储方式(如本地文件或 SQLite 数据库)和使用 Bouncy Castle 加密库对数据进行 AES 加密。通过示例代码展示了数据的加密、存储及解密过程,帮助开发者保护用户敏感信息,防止数据泄露。
147 3
|
11月前
|
存储 安全 数据库
Uno Platform 安全数据存储秘籍大公开!加密、存储、读取全攻略,让你的数据固若金汤!
在 Uno Platform 中实现安全的数据存储需要选择合适的数据存储方式,并对存储的数据进行加密。通过加密数据,可以保护用户的敏感信息,防止数据泄露。同时,在读取和使用数据时,需要进行解密操作,确保数据的可用性。希望本文对你在 Uno Platform 中实现安全的数据存储有所帮助。
119 0