如何将加密和解密函数应用到实际项目中?

简介: 如何将加密和解密函数应用到实际项目中?

在实际项目中,将加密和解密函数应用到 Pinia 状态管理中,需要结合插件机制实现自动化加密存储,并确保代码可维护、安全性可控。以下是分步骤的落地方案:

第一步:准备加密工具函数

先创建独立的加密解密工具(复用之前的实现,确保密钥安全):

// src/utils/crypto.js
import CryptoJS from 'crypto-js';

// 生产环境:从后端接口动态获取密钥(这里仅示例)
// 注意:密钥必须是16/24/32字节,IV为16字节
let SECRET_KEY = CryptoJS.enc.Utf8.parse('temp-key-16byte'); // 临时密钥
let IV = CryptoJS.enc.Utf8.parse('temp-iv-16byte__');

// 动态更新密钥(例如登录后从后端获取)
export const updateCryptoKey = (newKey, newIV) => {
   
  SECRET_KEY = CryptoJS.enc.Utf8.parse(newKey);
  IV = CryptoJS.enc.Utf8.parse(newIV);
};

// 加密
export const encrypt = (data) => {
   
  if (!data) return '';
  try {
   
    const dataStr = typeof data === 'string' ? data : JSON.stringify(data);
    return CryptoJS.AES.encrypt(dataStr, SECRET_KEY, {
   
      iv: IV,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    }).toString();
  } catch (error) {
   
    console.error('加密失败:', error);
    return '';
  }
};

// 解密
export const decrypt = (encryptedStr) => {
   
  if (!encryptedStr) return null;
  try {
   
    const bytes = CryptoJS.AES.decrypt(encryptedStr, SECRET_KEY, {
   
      iv: IV,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    });
    const decryptedStr = bytes.toString(CryptoJS.enc.Utf8);
    return decryptedStr ? JSON.parse(decryptedStr) : null;
  } catch (error) {
   
    console.error('解密失败:', error);
    return null;
  }
};

第二步:创建 Pinia 加密插件

通过 Pinia 插件自动监听状态变化,实现“状态修改时加密存储,初始化时解密读取”:

// src/plugins/piniaEncrypt.js
import {
    encrypt, decrypt } from '@/utils/crypto';

/**
 * 创建加密存储插件
 * @param {Object} options - 配置项
 * @param {Storage} options.storage - 存储方式(localStorage/sessionStorage)
 * @param {string[]} options.include - 需要加密的store名称列表(空则全部加密)
 */
export const createEncryptPlugin = (options = {
   }) => {
   
  const {
    storage = localStorage, include = [] } = options;

  return (context) => {
   
    const {
    store } = context;
    const storeName = store.$id;

    // 判断当前store是否需要加密(include为空则全部加密)
    const shouldEncrypt = include.length === 0 || include.includes(storeName);
    if (!shouldEncrypt) return;

    // 1. 初始化:从存储中解密数据并同步到store
    const loadEncryptedData = () => {
   
      const encryptedData = storage.getItem(`pinia_${
     storeName}`);
      if (encryptedData) {
   
        const decryptedData = decrypt(encryptedData);
        if (decryptedData) {
   
          store.$patch(decryptedData); // 合并解密后的数据到状态
        }
      }
    };

    // 2. 监听状态变化:自动加密存储
    const saveEncryptedData = () => {
   
      const state = store.$state; // 获取当前状态
      const encryptedData = encrypt(state);
      storage.setItem(`pinia_${
     storeName}`, encryptedData);
    };

    // 初始化加载数据
    loadEncryptedData();

    // 监听状态变化并保存(防抖避免频繁存储)
    let debounceTimer;
    store.$subscribe(() => {
   
      clearTimeout(debounceTimer);
      debounceTimer = setTimeout(saveEncryptedData, 100); // 100ms防抖
    });

    // 3. 给store添加手动加密存储的方法
    store.$encryptSave = saveEncryptedData;
    store.$clearEncryptedStorage = () => {
   
      storage.removeItem(`pinia_${
     storeName}`);
    };
  };
};

第三步:在项目中配置 Pinia 并应用插件

在 Pinia 初始化时注册加密插件,指定需要加密的 store:

// src/store/index.js
import {
    createPinia } from 'pinia';
import {
    createEncryptPlugin } from '@/plugins/piniaEncrypt';

const pinia = createPinia();

// 应用加密插件:只加密user和settings两个store
pinia.use(createEncryptPlugin({
   
  storage: localStorage, // 可选:使用sessionStorage
  include: ['user', 'settings'] // 指定需要加密的store名称
}));

export default pinia;

第四步:定义需要加密的 Store

创建普通的 Pinia Store,插件会自动对其状态进行加密处理:

// src/store/user.js
import {
    defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
   
  state: () => ({
   
    token: '',
    userInfo: {
   
      id: '',
      name: '',
      phone: '' // 敏感信息,需要加密
    }
  }),
  actions: {
   
    login(data) {
   
      this.token = data.token;
      this.userInfo = data.userInfo;
      // 状态变化后会自动加密存储,无需手动调用
    },
    logout() {
   
      this.$reset();
      this.$clearEncryptedStorage(); // 清除存储的加密数据
    }
  }
});

第五步:在组件中使用(无需关心加密细节)

组件中正常使用 Store,加密/解密逻辑由插件自动处理:

<!-- src/views/Login.vue -->
<template>
  <button @click="handleLogin">登录</button>
</template>

<script setup>
import { useUserStore } from '@/store/user';
import { updateCryptoKey } from '@/utils/crypto';

const userStore = useUserStore();

const handleLogin = async () => {
  // 1. 调用登录接口,获取用户数据和动态密钥
  const loginRes = await api.login({ username: 'test', password: '123' });
  const { token, userInfo, cryptoKey, cryptoIV } = loginRes.data;

  // 2. 更新加密密钥(关键:生产环境必须动态获取密钥)
  updateCryptoKey(cryptoKey, cryptoIV);

  // 3. 更新状态(插件会自动加密存储)
  userStore.login({ token, userInfo });
};
</script>

核心要点与安全实践

  1. 密钥动态获取
    生产环境中,SECRET_KEYIV 必须通过后端接口动态返回(例如用户登录后),绝对不能硬编码在前端代码中(避免被打包暴露)。

  2. 按需加密
    通过插件的 include 配置,只对包含敏感信息的 Store(如 user)加密,普通 Store(如 theme)无需加密,减少性能损耗。

  3. 防抖动存储
    状态频繁变化时(如输入框),通过防抖(setTimeout)避免加密存储操作过于频繁,优化性能。

  4. 异常处理
    加解密函数中添加错误捕获,避免因密钥错误或数据损坏导致整个应用崩溃。

  5. 数据清除
    用户登出时,不仅要重置状态,还要调用 $clearEncryptedStorage 清除本地加密数据,防止信息泄露。

通过这种方式,加密解密逻辑与业务代码解耦,既保证了敏感数据的安全性,又不影响开发体验。

相关文章
|
1月前
|
存储 JSON 安全
加密和解密函数的具体实现代码
加密和解密函数的具体实现代码
335 136
|
2月前
|
存储 数据安全/隐私保护
如何将加密和解密函数应用到Pinia状态中?
如何将加密和解密函数应用到Pinia状态中?
259 124
|
2月前
|
存储 JSON 安全
加密和解密函数是如何实现的?
加密和解密函数是如何实现的?
409 123
|
3月前
|
存储 关系型数据库 MySQL
MYSQL数据加密压缩函数应用实战指南。
总的来说,加密和压缩是维护MySQL数据库中数据安全性和效率的有效手段。使用时需权衡性能与安全,合理应用加密和压缩函数。在设计数据库架构时要考虑到加密字段的查询性能,因为加密可能使得一些索引失效。压缩数据能有效减少存储空间的占用,但在服务器负载较高时应避免实时压缩和解压,以免影响总体性能。
147 10
|
2月前
|
存储 弹性计算 安全
现有数据库系统中应用加密技术的不同之处
本文介绍了数据库加密技术的种类及其在不同应用场景下的安全防护能力,包括云盘加密、透明数据加密(TDE)和选择列加密。分析了数据库面临的安全威胁,如管理员攻击、网络监听、绕过数据库访问等,并通过能力矩阵对比了各类加密技术的安全防护范围、加密粒度、业务影响及性能损耗。帮助用户根据安全需求、业务改造成本和性能要求,选择合适的加密方案,保障数据存储与传输安全。
|
3月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
933 10
|
9月前
|
云安全 安全 数据建模
《数字证书:互联网世界的"身份证"与"防盗门"》 ——揭秘网络安全背后的加密江湖
在2023年某深夜,上海陆家嘴金融公司机房遭遇黑客攻击,神秘青铜大门与九大掌门封印的玉牌突现,阻止了入侵。此门象征数字证书,保障网络安全。数字证书如验钞机识别假币,保护用户数据。它通过SSL/TLS加密、CA认证和非对称加密,构建安全通信。证书分为DV、OV、EV三类,分别适合不同场景。忽视证书安全可能导致巨额损失。阿里云提供一站式证书服务,助力企业部署SSL证书,迎接未来量子计算和物联网挑战。
|
11月前
|
安全 算法 网络协议
【网络原理】——图解HTTPS如何加密(通俗简单易懂)
HTTPS加密过程,明文,密文,密钥,对称加密,非对称加密,公钥和私钥,证书加密
|
11月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
217 10
|
11月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。