【Vue3中使用crypto-js】crypto-js加密解密用法

news2025/1/10 8:16:29

目录

  • 1、安装crypto
  • 2、创建crypto.js文件
  • 3、在main.js主文件中进行引用
  • 4、页面中进行使用
  • 5、实现效果展示
  • 6、加密模式解析以及iv参数使用

1、安装crypto

npm install crypto-js 
如果是在Typescript版本需要再安装
npm install --save @types/crypto-js

2、创建crypto.js文件

注意点:

  • CryptoJS.enc.Utf8.parse(‘xxxxx’)秘钥应该前后端保持一致,否则会导致加密和解密无法正常进行,因为只有使用相同的密钥才能正确地加密和解密数据。
  • 密钥的长度和格式需要符合 AES 加密算法的要求

详解:

  • CryptoJS.AES.encrypt 是 crypto - js 库中用于 AES 加密的方法,它接受三个参数:

  • plaintext:要加密的文本

  • KEY:定义的加密密钥。

  • 一个配置对象,这里指定了两个属性:

    • mode:加密模式,设置为 CryptoJS.mode.ECB,即电子密码本模式。ECB 模式是一种简单的加密模式,它将明文分成固定长度的块,然后对每个块进行独立加密。但这种模式存在安全风险,例如相同的明文块会加密成相同的密文块,容易被攻击者利用进行分析,在实际生产中不推荐使用,建议使用更安全的模式,如 CBC或 GCM。
    • padding:填充模式,设置为 CryptoJS.pad.Pkcs7。PKCS7 填充是一种常用的填充方式,它会在明文的末尾填充一定数量的字节,使得明文长度是块大小的整数倍。这里提到前端使用 Pkcs7 对应后端的 Pkcs5,实际上 PKCS5 是块大小固定为 8 字节的 PKCS7 填充的特殊情况,在实际使用中要确保前后端对填充方式的理解和处理一致。
  • .toString():加密操作返回一个 WordArray 对象,调用 toString() 方法将其转换为字符串形式的密文,以便于存储和传输。
    —————————————————————————————————

  • CryptoJS.AES.decrypt 是 crypto - js 库中用于 AES 解密的方法。它接受三个参数:

    • jsonStr:要解密的密文
    • KEY:与加密时相同的密钥。
    • 配置对象,同样指定了 mode 为 ECB 模式,padding 为 Pkcs7 填充模式。
  • .toString(CryptoJS.enc.Utf8):解密操作返回一个 WordArray 对象,调用 toString(CryptoJS.enc.Utf8) 方法将其转换为 UTF - 8 编码的字符串形式的明文。

import CryptoJS from 'crypto-js'

/**
 * AES 加密
 * KEY:  需要前后端保持一致
 * mode: ECB  需要前后端保持一致
 * pad: Pkcs7 //前端 Pkcs7 对应 后端 Pkcs5
 */
const KEY = CryptoJS.enc.Utf8.parse('a761009ce3547b727e9387f2e6afadb2') // 秘钥
// const KEY = CryptoJS.lib.WordArray.random(16).toString(CryptoJS.enc.Hex)

// 生成随机的iv,长度为16字节
const iv = CryptoJS.lib.WordArray.random(16)

export const AES_Encrypt = (plaintext) => {
  let ciphertext = CryptoJS.AES.encrypt(plaintext, KEY, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  }).toString()
  return ciphertext
}

/**
 * AES 解密
 */
export const AES_Decrypt = (jsonStr) => {
  let plaintext = CryptoJS.AES.decrypt(jsonStr, KEY, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  }).toString(CryptoJS.enc.Utf8)

  return plaintext
}

3、在main.js主文件中进行引用

import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'
//全局密码加密
import { AES_Encrypt, AES_Decrypt } from '@/utils/crypto.js'

const app = createApp(App)

app.use(createPinia())
app.use(router)
app.config.globalProperties.$AES_Encrypt = AES_Encrypt //全局加密
app.config.globalProperties.$AES_Decrypt = AES_Decrypt //全局解密

app.mount('#app')

4、页面中进行使用

<template><div>index</div></template>

<script>
import { getCurrentInstance } from 'vue'
export default {
  setup() {
    const password = '2345687'
    // 使用getCurrentInstance获取proxy从而调用全局方法
    const { proxy } = getCurrentInstance()
    const encryptedPassword = proxy.$AES_Encrypt(password)
    console.log(encryptedPassword, '1111加密后的密码')
    const decryptedPassword = proxy.$AES_Decrypt(encryptedPassword)
    console.log(decryptedPassword, '1111解密后的密码')
  },
}
</script>

5、实现效果展示

在这里插入图片描述

在最后描述一下,我在main.js代码中使用的是CryptoJS的ECB(电子密码本模式);
将明文分成固定长度的块,每个块独立使用密钥进行加密,相同的明文块会生成相同的密文块,加密和解密过程相对简单,易于实现,加密速度快。由于相同明文块加密结果相同,容易受到已知明文攻击,安全性较低。适用于对少量数据且安全性要求不高的加密,如加密单个密钥等。

6、加密模式解析以及iv参数使用

像CryptoJS.mode加密模式解析还有:

  • CBC(Cipher Block Chaining,密码块链接模式)
  • CFB(Cipher Feedback,密文反馈模式)
  • OFB(Output Feedback,输出反馈模式)
  • CTR(Counter,计数器模式)

在CryptoJS.AES.encrypt方法中,iv(Initialization Vector,初始化向量)是一个可选参数,主要用于加密算法的初始化过程。
在CryptoJS中使用ECB(电子密码本模式)时不能使用iv。

以下是一个使用iv参数的CryptoJS.AES.encrypt加密示例:

import CryptoJS from 'crypto-js';

// 定义密钥和明文
const key = CryptoJS.enc.Utf8.parse('a761009ce3547b727e9387f2e6afadb2');
const plaintext = 'Hello, World!';

// 生成随机的iv,长度为16字节
const iv = CryptoJS.lib.WordArray.random(16);

// 使用AES加密,传入密钥和iv
const ciphertext = CryptoJS.AES.encrypt(plaintext, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
}).toString();

console.log(ciphertext);

在上述示例中,通过CryptoJS.lib.WordArray.random(16)生成了一个 16 字节的随机iv,然后在CryptoJS.AES.encrypt方法中传入iv参数,指定了加密模式为CBC(Cipher Block Chaining,密码块链接模式),这种模式下需要使用iv。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨界融合:人工智能与区块链如何重新定义数据安全?

引言&#xff1a;数据安全的挑战与现状 在信息化驱动的数字化时代&#xff0c;数据已成为企业和个人最重要的资产之一。然而&#xff0c;随着网络技术的逐步优化和数据量的爆发式增长&#xff0c;数据安全问题也愈变突出。 数据安全现状&#xff1a;– 数据泄露驱动相关事件驱…

简单易用的PDF工具箱

软件介绍 PDF24 Creator是一款简单易用的PDF工具箱&#xff0c;而且完全免费&#xff0c;没有任何功能限制。既可以访问官网在线使用各种PDF工具&#xff0c;也可以下载软件离线使用各种PDF工具。 软件功能 1、PDF转换 支持将多种文件格式&#xff08;Word、PowerPoint、Exc…

低秩信息收集_0109

系列博客目录 文章目录 系列博客目录LoRA: Low-Rank Adaptation of Large Language Models传统模型适配的局限性&#xff1a;尽管研究界致力于通过添加适配器层或优化输入层激活来提高模型适配效率&#xff0c;这些方法在大型模型和延迟敏感的环境中存在局限。适配器层尽管参数…

C语言与ASCII码应用之简单加密

加密是什么&#xff1f;什么是加密通话&#xff1f;用人话说就是一句有含义的话&#xff0c;经过一定的特殊规则把里面的每个字按照这个规则进行改变&#xff0c;但是这个规则只有你和你想让知道这条信息的人知道 今天我们来用ASCII码编写一个简单加密与解密的程序&#xff0c…

国产3D CAD将逐步取代国外软件

在工业软件的关键领域&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;软件对于制造业的重要性不言而喻。近年来&#xff0c;国产 CAD 的发展态势迅猛&#xff0c;展现出巨大的潜力与机遇&#xff0c;正逐步改变着 CAD 市场长期由国外软件主导的格局。 国产CAD发展现状 …

【Linux网络编程】第二十二弹---深入理解 I/O 多路转接之 epoll:系统调用、工作原理、代码演示及应用场景

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、I/O 多路转接之 epoll 1.1、epoll 初识 1.2、epoll 的相关系统调用 1.2.1、epoll_create 1.2.2、epol…

品牌账号矩阵如何打造?来抄作业

在讲究全域营销的当下&#xff0c;目前企业都在各自搭建品牌矩阵号&#xff0c;以提升自己在不同渠道上的影响力。虽然不同平台之间有诸多细节值得深究&#xff0c;但也不妨碍我们先了解如何搭建品牌矩阵。接下来&#xff0c;就让我们一同来了解下该如何搭建。 一、一个主账号 …

备考蓝桥杯:数据结构概念浅谈

目录 1数据结构的概念 什么是数据结构: 为什么要有数据结构 2.数据结构的三个组成要素 1.逻辑结构 2.存储结构 3.数据运算 3。算法好坏的度量&#xff08;时间复杂度和空间复杂度&#xff09; 时间复杂度计算 最优和平均和最差时间复杂度 计算时间复杂度例子 空间复…

scala代码打包配置(maven)

目录 mavenpom.xml打包配置项&#xff08;非完整版&#xff0c;仅含打包的内容< build>&#xff09;pom.xml完整示例&#xff08;需要修改参数&#xff09;效果说明 maven 最主要的方式还是maven进行打包&#xff0c;也好进行配置项的管理 以下为pom文件&#xff08;不要…

用于 EV 牵引电机的先进冷却技术

电动汽车牵引电机的冷却挑战 热管理的重要性 有效的热管理在电动汽车 &#xff08;EV&#xff09; 设计中至关重要&#xff0c;尤其是在牵引电机方面。这些电机将电能转化为机械运动&#xff0c;对车辆的整体性能和效率至关重要。 管理它们的热量至关重要&#xff0c;不仅可以…

课题推荐——基于GPS的无人机自主着陆系统设计

关于“基于GPS的无人机自主着陆系统设计”的详细展开&#xff0c;包括项目背景、具体内容、实施步骤和创新点。如需帮助&#xff0c;或有导航、定位滤波相关的代码定制需求&#xff0c;请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …

毕业项目推荐:基于yolov8/yolov5/yolo11的动物检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

OpenLDAP 进阶指南:复制、引用与别名配置详解

文章目录 1.复制和引用概述2.LDAP 引用3.LDAP 复制4.OpenLDAP 复制4.1 OpenLDAP syncrepl方式复制(从2.3版本开始)4.2 Replication refreshAndPersist (provider Push)4.3 OpenLDAP syncrepl (N-Way) 多主复制 前言 本章提供了关于配置LDAP系统进行复制(replication)、引用(ref…

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域&#xff0c;设计模式是解决常见设计问题的经典方案。1994 年&#xff0c;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides&#xff08;四人帮&#xff0c;GoF&#xff09;在《设计模式&#xff1a;可复用面向对象软件的基础》一书中系统性地总结了…

最好用的图文识别OCR -- PaddleOCR(2) 提高检测识别精度 推理效率(PPOCR模型转ONNX模型进行推理)

提高检测识别精度 && 推理效率 基于项目环境准备高效率版本1 下载模型与相关资源2. 模型转换3. 转换后效果测试测试图片示例&#xff1a;使用 PaddleOCR 模型进行推理&#xff1a;使用转换后的 ONNX 模型进行推理&#xff1a; 高精度版本1 下载模型与相关资源2 配置Pad…

保护性暂停原理

什么是保护性暂停&#xff1f; 保护性暂停&#xff08;Guarded Suspension&#xff09;是一种常见的线程同步设计模式&#xff0c;常用于解决 生产者-消费者问题 或其他需要等待条件满足后再继续执行的场景。通过这种模式&#xff0c;一个线程在执行过程中会检查某个条件是否满…

Linux 工作队列

系列文章目录 Linux内核学习 Linux 知识&#xff08;1&#xff09; Linux 知识&#xff08;2&#xff09; Linux 工作队列 Linux 内核源代码情景分析&#xff08;一&#xff09; Linux 设备驱动程序&#xff08;二&#xff09; 文章目录 系列文章目录综述工作&#xff08;work_…

计算机的错误计算(二百零六)

摘要 电脑准备关机时&#xff0c;看到不知什么时候触发跳出了一个**AI助手页面。里面有关于等价的讨论内容&#xff0c;特记录&#xff0c;以警世人&#xff1a;大模型犯错&#xff0c;不是个别现象。 例1. 下面是对话。问题是&#xff1a; 和 等价吗&#xff1f;在 (0, ) …

支持向量回归(SVR:Support Vector Regression)用于A股数据分析、预测

简单说明 支持向量回归是一种用来做预测的数学方法,属于「机器学习」的一种。 它的目标是找到一条「最合适的线」,能够大致描述数据点的趋势,并允许数据点离这条线有一定的误差(不要求所有点都完全落在这条线上)。 可以把它想象成:找到一条「宽带」或「隧道」,大部分…

web作业

作业一 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> </head&g…