前端实现rsa加密功能

news/2025/2/27 6:22:16

本文将从web和小程序两个端来实现rsa的加密功能。
一般项目的登录密码、身份证号以及一些用户敏感信息等在传输的时候需要使用加密传输,一般来说,前端只会得到后端给的公钥,而rsa加密,可以用公钥加密,也可以用私钥加密,即可以用一个公钥进行加密,也可以去解密后端经过私钥加密的数据,在我的项目中,我只需要把用户输入的信息进行加密传输给后端,所以只需要使用到公钥(这个公钥后端会提供)

1.web端使用rsa加密

首先安装项目所需要的包

  1. 安装jsencrypt
npm install jsencrypt --save-dev
  1. 安装encryptlong
npm install encryptlong --save-dev
  1. 创建rsa.js文件
    在项目的根目录的src文件下创建utils文件夹,创建rsa.js文件

在这里插入图片描述
4 引入并封装加密方法

/* 引入JSEncrypt实现数据RSA加密 */
import JSEncrypt from 'jsencrypt' // 处理长文本数据时报错 JSEncrypt.js Message too long for RSA
/* 引入encryptlong实现数据RSA加密 */
import Encrypt from 'encryptlong' // encryptlong是基于jsencrypt扩展的长文本分段加解密功能。

// RSA 公钥
const publicKey = `后端给的公钥`

export default {
    /**
     * 使用JSEncrypt进行短文本加密
     * @param {string} data - 要加密的数据
     * @param {string} [key=publicKey] - 可选的公钥,默认使用主公钥
     * @returns {string} 加密后的数据
     */
    rsaEncrypt(data, key = publicKey) {
        const jsencrypt = new JSEncrypt();
        jsencrypt.setPublicKey(key);
        // 如果是对象/数组的话,需要先JSON.stringify转换成字符串
        return jsencrypt.encrypt(data);
    },

    /**
     * 使用encryptlong进行长文本加密
     * @param {string} data - 要加密的数据
     * @param {string} [key=publicKey] - 可选的公钥,默认使用主公钥
     * @returns {string} 加密后的数据
     */
    encrypt(data, key = publicKey) {
        const encryptor = new Encrypt();
        encryptor.setPublicKey(key);
        // 如果是对象/数组的话,需要先JSON.stringify转换成字符串
        return encryptor.encryptLong(data);
    }
}

  1. 项目中使用
import Rsa from '@/utils/rsa'
const loginParams: LoginParams = {
      phone: loginForm.value.phone,
      password: Rsa.encrypt(loginForm.value.password)
    }
  1. 添加类型声明
    如果是ts项目,还需要添加rsa文件的类型声明
declare module '@/utils/rsa' {
    interface RsaUtils {
      /**
       * 使用JSEncrypt进行短文本加密
       * @param data - 要加密的数据
       * @param key - 可选的公钥,默认使用主公钥
       */
      rsaEncrypt(data: string, key?: string): string;
  
      /**
       * 使用encryptlong进行长文本加密
       * @param data - 要加密的数据
       * @param key - 可选的公钥,默认使用主公钥
       */
      encrypt(data: string, key?: string): string;
    }
  
    const rsa: RsaUtils;
    export default rsa;
  } 

2.小程序端使用rsa加密

本来也使用和web端同样的方式去引入jsencrypt和encryptlong ,但是一直在报错不能使用。 踩了很多坑发现这两个包的源码的判断的某些字段小程序里并不支持, 所以我们需要直接去修改node_modules里的jsencrypt源码,去做小程序的兼容,也就意味着我们不能使用npm下载的方式去引入(因为不要用npm下载方式,这样引入的还是官方的依赖库,修改是无效的,是在官方的js文件修改后丢入utils文件夹下,再引入),接下来总结几个需要做兼容的地方

  1. 小程序使用jsencrypt加密,报Uncaught TypeError: Cannot read property ‘appName‘ of undefined问题
    解决措施:navigator主要是对浏览器的判断,同时小程序中没有appName,直接删除或者保留最后一个else即可。这个解决后还会有其他的问题按照报错做兼容处理即可
    找到代码中的
    if (j_lm && (navigator.appName == “Microsoft Internet Explorer”)) {
    BigInteger.prototype.am = am2;
    dbits = 30;
    } else if (j_lm && (navigator.appName != “Netscape”)) {
    BigInteger.prototype.am = am1;
    dbits = 26;
    } else { // Mozilla/Netscape seems to prefer am3
    BigInteger.prototype.am = am3;
    dbits = 28;
    }
    直接删掉改为
    BigInteger.prototype.am = am3;
    dbits = 28;

  2. 解决uniapp开发微信小程序AES加密报错:TypeError: Cannot read property ‘crypto‘ of undefined
    if (window.crypto && window.crypto.getRandomValues) { // 生成长度为256,元素值为0的数组
    var z = new Uint32Array(256); // 生成长度为256,元素随机值的数组
    window.crypto.getRandomValues(z);
    }
    替换为
    var getRandomValues = function (array) {
    for (var i = 0, l = array.length; i < l; i++) { array[i] = Math.floor(Math.random() * 256);
    } return array;
    }
    var z = new Uint32Array(256);getRandomValues(z);
    参考文档:参考文档1
    参考文档2
    小程序兼容后的源码:https://github.com/zhangs3721/wx_jsencrypt?tab=readme-ov-file
    https://github.com/UFO0001/WX_RSA?tab=readme-ov-file


http://www.niftyadmin.cn/n/5869636.html

相关文章

【Linux】gdb/cgdb调试工具

目录 前言&#xff1a; 一、安装gdb/cgdb 二、调试可执行程序 1.release版本和debug版本的区别 2.调试程序(命令讲解) 2.1 l n(罗列第n行代码) 2.2 r(运行代码) 2.3 b n(在第n行设置断点) 2.4 info b(查看断点信息) 2.5 d n(删除ID为n断点) 2.6 disable n/enable n…

【Project】基于Prometheus监控docker平台

一、设计背景 1.1项目简介 本项目旨在创建一个全面的容器化应用程序监控解决方案&#xff0c;基于Prometheus监控Docker平台上的各种服务。在当今的软件开发环境中&#xff0c;容器化技术已成为一种关键的工具&#xff0c;使应用程序能够更快速、可靠地交付和扩展。然而&…

谷歌推出PaliGemma 2 mix:用于多任务的视觉语言模型,开箱即用。

去年 12 月&#xff0c;谷歌推出了 PaliGemma 2 &#xff0c;这是Gemma系列中的升级版视觉语言模型。该版本包含不同大小&#xff08;3B、10B 和 28B 参数&#xff09;的预训练检查点&#xff0c;可轻松针对各种视觉语言任务和领域进行微调&#xff0c;例如图像分割、短视频字幕…

智能合约安全 | 合约无效化攻击

目录&#xff1a; 智能合约安全 合约无效化攻击 合约自毁函数 selfdestruct 攻击实现 漏洞防御 总结 智能合约安全 合约无效化攻击 合约无效化攻击类同于web安全中的逻辑漏洞中的一种 我们这里拿一个典型的例子来讲解 有这样一份智能合约, 每个人可以向其中发送1 eth 第七个…

vue测试:单元测试、组件测试、端到端测试

1、单元测试&#xff1a;单元测试通常适用于独立的业务逻辑、组件、类、模块或函数&#xff0c;不涉及 UI 渲染、网络请求或其他环境问题。 describe(increment, () > {// 测试用例 }) toBe()&#xff1a;用于严格相等比较&#xff08;&#xff09;&#xff0c;适用于原始类…

win11本地部署deepseek大模型(安装ollama+docker+open-webui)最终实现自己的项目可通过API调用投喂数据后的模型

硬件配置&#xff1a;笔记本win11&#xff0c;内存32G&#xff0c;CPU锐龙7 &#xff0c;无独显&#xff1b;只能考虑deepseek-r1:1.5b模型。 第一步&#xff1a;安装Ollama 此处不过多累赘了&#xff0c;https://ollama.com/官网选择对应的系统版本下载即可。 需要注意的是…

前端关于Cursor编辑器的了解与深度使用及对工作的便利

1. 什么是 Cursor 编辑器? Cursor 是一款基于 AI 的现代代码编辑器,类似于 VS Code,但内置了强大的 AI 功能。它的核心目标是帮助开发者更快、更智能地编写代码。 主要特点: AI 驱动的代码补全:提供上下文相关的智能代码建议。代码生成与修复:通过自然语言描述生成代码…

(功能测试)第五章 APP性能测试 常用的APP命令格式 补充与总结

app性能测试 solopi 工具监控性能数据 实时监控所选项的各类数据的变化 性能测试就是记录性能数据 从而去分析是否是存在有异常 使用工具去监控数据 查看录制数据 可以持续使用两个小时去查看性能的使用情况 重点是对拿到的数据去进行分析 内存数据查看 性能指标有如下内容&a…