在vue项目中使用SM4加密登录

Vue项目中实现sm4加密解密

1. Vue实现sm4加密登录操作

1. 安装 sm4util

// 安装
npm install sm4util

2. 使用

1. 创建工具文件

在 utils 文件夹中 创建 sm4Util.js 文件

import { SM4Util } from 'sm4util'

var sm4 = new SM4Util()
const pwdKey = "B@_Aute*1Z5OdS0*"; //密钥  前后端一致即可,后端提供

/* 
 * 加密工具函数
 * @param {String} text 待加密文本
 */
export function encrypt(text) {
  return sm4.encryptCustom_ECB(text, pwdKey);
}

/*
 * 解密工具函数
 * @param {String} text 待解密密文
 */
 export function decrypt(text) {
  return sm4.decryptCustom_ECB(text, pwdKey);
}
2.在登录文件中调用
// 引入到文件中
import { encrypt, decrypt } from '@/utils/sm4Util';

// 登录按钮
submitForm(formName) {
    this.loginFunction(formName);
},
// 登录
loginFunction(formName) {
    this.$refs[formName].validate((valid) => {
        if (valid) {
            /*登录接口*/
            localStorage.clear();
            // if(this.loginLoading) return
            this.loginLoading = true;
            let b = "KBCDEFRT" + JSON.stringify(this.param) + 14725436;
            let data = {
                params: encrypt(b),
            };
            return new Promise((resolve) => {
                login(data)
                  .then((res) => {
                    this.loginLoading = false;
                    let dataJSON = decrypt(res.result);
                    let data = dataJSON.slice(8, dataJSON.length - 8);
                    let resultDate = JSON.parse(data);
                    if (
                        res.success &&
                        resultDate !== undefined &&
                        resultDate !== null
                    ) {
                        const userInfo = resultDate.userInfo;
                        localStorage.setItem("ACCESS_TOKEN", resultDate.token);
                        localStorage.setItem("token", resultDate.token);
                        localStorage.setItem("USER_NAME", {
                            username: userInfo.username,
                            realname: userInfo.realname,
                        });
                        this.$message.success("登录成功");
                        this.$router.push("/home");
                        resolve();
                    } else {
                        this.$message.error(res.message);
                        resolve();
                    }
                }).finally(() => {
                    resolve();
                });
            });
        } else {
            this.$message.error("请输入账号和密码");
            this.loginLoading = false;
            return false;
        }
    });
},

2. Vue实现加密传参,解密返回值

// 引入

import { encrypt, decrypt } from "@/utils/sm4Util";

// 项目点位点击后,项目基础信息 弹框查询
queryGetProjectBaseInfo(data) {
    // 加密
    let datas = "abcddcba" + JSON.stringify(data) + 12345678;
    let params = {
        params: encrypt(datas),
    };
    // 调用接口
    getProjectBaseInfo(params)
        .then((res) => {
        if (res.success && res.result !== undefined && res.result !== null) {
            // 解密
            let dataJSON = decrypt(res.result);
            let data = dataJSON.slice(8, dataJSON.length - 8);
            this.baseInfo = Object.keys(JSON.parse(data)).length > 0 ? JSON.parse(data) : {};
        } else {
            this.baseInfo = {};
        }
    }).finally(() => {});
},
<think>我们参考用户提供的引用内容,重点在于在Vue项目中实现SM4加解密操作。根据引用内容,有几种不同的库和方法可以实现,例如使用`gm-crypto`、`sm-crypto`和`asmcrypto.js`。为了在Vue中方便使用,我们可以选择其中一种库进行封装。用户引用中提到了几种方式:1.引用[1]:使用一个封装好的sm4Util.js,通过import引入encrypt和decrypt方法。2.引用[2]:使用asmcrypto.js库,在Vue组件的方法中直接使用。3.引用[3]:使用gm-crypt库,在表单提交时进行加密,并提供了配置参数。4.引用[4]:使用sm-crypto库进行文件加解密。综合考虑,我们选择使用`gm-crypt`库或`sm-crypto`库,因为它们在引用中出现较多,且使用较为简单。下面分别提供两种方案:###方案一:使用`gm-crypt`库(推荐)这个库支持SM4的ECB和CBC模式,并可以配置密钥、iv向量和输出格式。步骤:1.安装依赖2.封装一个工具文件(如sm4Util.js)3.Vue组件中使用封装的工具方法####1.安装```bashnpminstallgm-crypt```####2.封装工具类在项目中创建一个文件,例如`src/utils/sm4Util.js`,内容如下:```javascriptimportGMCryptfrom'gm-crypt';//创建配置对象,这些配置应该和后端一致constsm4Config={key:'GJwsXX_BzW=gJWJW',//16字节密钥,建议改为自己的密钥iv:'ZkR_SiNoSOFT=568',//CBC模式需要16字节iv,ECB模式不需要,但为了通用,这里保留mode:'cbc',//可选模式:cbc或ecbcipherType:'base64'//输出格式:base64、text(字符串)或hex(十六进制字符串)};constsm4=newGMCrypt.sm4(sm4Config);//加密函数exportfunctionencrypt(plaintext){returnsm4.encrypt(plaintext);}//解密函数exportfunctiondecrypt(ciphertext){returnsm4.decrypt(ciphertext);}```####3.Vue组件中使用```vue<template><div><inputv-model="inputText"placeholder="输入要加密的文本"><button@click="handleEncrypt">加密</button><p>加密结果:{{encryptedText}}</p><button@click="handleDecrypt">解密</button><p>解密结果:{{decryptedText}}</p></div></template><script>import{encrypt,decrypt}from'@/utils/sm4Util'exportdefault{data(){return{inputText:'',encryptedText:'',decryptedText:''}},methods:{handleEncrypt(){this.encryptedText=encrypt(this.inputText);},handleDecrypt(){this.decryptedText=decrypt(this.encryptedText);}}}</script>```###方案二:使用`sm-crypto`库这个库更轻量,但功能相对简单。步骤:1.安装```bashnpminstallsm-crypto```2.封装工具类(`src/utils/sm4Util.js`)```javascriptimport{sm4}from'sm-crypto';//密钥,必须为16字节的十六进制字符串(32个字符)constkey='0123456789abcdef0123456789abcdef';//注意:sm-crypto的sm4加密默认是ecb模式,输出为十六进制字符串//如果需要cbc模式,则需要额外参数iv,但该库目前仅支持ecb模式(查看文档:https://github.com/JuneAndGreen/sm-crypto)exportfunctionencrypt(plaintext){returnsm4.encrypt(plaintext,key);}exportfunctiondecrypt(ciphertext){returnsm4.decrypt(ciphertext,key);}```在组件中的使用方式与方案一相同。###注意事项1.**密钥管理**:在实际项目中,密钥不应明文存储在代码中,应该从安全的配置中获取(如环境变量),但前端存储密钥都不安全,所以一般用于临时传输加密(如密码传输加密),而且需要后端配合(后端用同样的密钥解密)。2.**模式选择**:在引用[3]中提到了CBC模式,而引用[4]中使用了ECB模式。CBC模式更安全,但需要前后端协商iv。3.**对齐后端**:加密的配置(密钥、iv、模式、输出格式)必须和后端保持一致,否则解密失败。4.**文件加密**:如果需要加密文件,可以像引用[4]中那样使用`sm-crypto`库,读取文件为ArrayBuffer,然后进行加密,再将加密后的内容保存为Blob。###针对文件加密的示例(使用sm-crypto)可以参考引用[4]中的方法,但注意`sm-crypto`的加密方法接受的是字符串(或十六进制字符串表示的二进制数据),因此需要将文件读取为合适的格式。以下是使用`sm-crypto`进行文件加密的步骤:1.读取文件为ArrayBuffer2.将ArrayBuffer转换为十六进制字符串(或使用`sm4.encrypt`方法支持的其他格式)3.加密4.加密结果转换为Blob提供下载具体代码可参考引用[4],但注意密钥的处理。###总结对于Vue项目,建议使用方案一(gm-crypt)进行SM4加解密,因为它支持更多的配置选项(如模式选择)。但请根据实际需求选择。如果你需要更高级的功能(如文件加密),可以使用方案二并参考引用[4]的代码。###相关问题1.如何在Vue项目中安全地存储SM4加密所需的密钥?2.SM4加密在传输敏感数据时如何与后端进行协同工作?3.Vue项目使用SM4加密大文件(例如超过100MB)时如何优化性能?希望这些信息对您有帮助!如果还有其他问题,请随时提问。</think> ### Vue.js中实现SM4加解密操作指南 以下是在Vue项目中实现SM4加解密的完整方案,结合引用内容的最佳实践: #### 方案一:使用`gm-crypt`库(推荐) ```bash npm install gm-crypt ``` ##### 封装工具文件 (`src/utils/sm4Util.js`) ```javascript import GMCrypt from 'gm-crypt'; // 配置参数(需与后端一致) const sm4Config = { key: "GJwsXX_BzW=gJWJW", // 16字节密钥 mode: "cbc", // 加密模式:ecb/cbc iv: "ZkR_SiNoSOFT=568", // cbc模式需要的初始向量 cipherType: "base64" // 输出格式:base64/hex/text }; const sm4 = new GMCrypt.sm4(sm4Config); export const encrypt = (plainText) => { return sm4.encrypt(plainText); }; export const decrypt = (cipherText) => { return sm4.decrypt(cipherText); }; ``` ##### 在Vue组件中使用 ```vue <template> <div> <input v-model="inputText" placeholder="输入文本"> <button @click="handleEncrypt">加密</button> <button @click="handleDecrypt">解密</button> <p>加密结果: {{ encryptedText }}</p> <p>解密结果: {{ decryptedText }}</p> </div> </template> <script> import { encrypt, decrypt } from '@/utils/sm4Util'; export default { data() { return { inputText: "", encryptedText: "", decryptedText: "" }; }, methods: { handleEncrypt() { this.encryptedText = encrypt(this.inputText); }, handleDecrypt() { this.decryptedText = decrypt(this.encryptedText); } } }; </script> ``` #### 方案二:使用`sm-crypto`库(更轻量) ```bash npm install sm-crypto ``` ##### 封装工具文件 ```javascript import { sm4 } from 'sm-crypto'; const key = '0123456789abcdef'; // 16字节密钥(十六进制或字符串) export const encrypt = (plainText) => { return sm4.encrypt(plainText, key); }; export const decrypt = (cipherText) => { return sm4.decrypt(cipherText, key); }; ``` #### 文件加密示例 (参考引用[4]) ```vue <template> <input type="file" @change="handleFileEncrypt"> </template> <script> import { sm4 } from 'sm-crypto'; export default { methods: { async handleFileEncrypt(e) { const file = e.target.files[0]; const password = this.$prompt('输入加密密码'); const arrayBuffer = await file.arrayBuffer(); const encrypted = sm4.encrypt( new Uint8Array(arrayBuffer), this.stringToHex(password), { output: 'array' } ); // 创建下载链接 const blob = new Blob([encrypted]); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = `encrypted_${file.name}`; link.click(); }, stringToHex(str) { return Array.from(str).map(c => c.charCodeAt(0).toString(16).padStart(2, '0') ).join(''); } } }; </script> ``` ### 关键配置说明 1. **模式选择**: - ECB:简单快速,相同输入产生相同输出 - CBC:更安全,需要配置iv(初始向量) $$ \text{IV} \oplus \text{Plaintext} \rightarrow \text{Block Cipher} $$ 2. **密钥规范**: - 必须为16字节(128位) - 建议使用Base64或Hex编码存储 3. **前后端协同**: - 确保前后端的密钥、iv、加密模式、填充方式一致 - 传输时使用Base64编码最通用 ### 安全建议 1. **密钥管理**: ```javascript // 推荐从环境变量读取 const key = process.env.VUE_APP_SM4_KEY; ``` 2. **传输安全**: - 对密码等敏感信息进行二次哈希处理 - 通过HTTPS传输加密数据 > 提示:国密算法$$ \text{SM4} $$在实际应用中需遵守《密码法》相关规定[^1],金融等领域强制使用国密算法[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值