【jsencrypt】-前端RSA加解密那些事儿-及使用JsEncrypt进行加解密啦~

  嗨~姐妹们 好久不见!最近因为工作太忙啦已经开始减少博客的构思了,其实有构思好几个项目中比较感兴趣的内容想分享给大家的,但是总是觉得写的不够好不够完善,所以草稿内容很多个,每一个都很难坚持写完。不过立个flag,我会近期把这些内容都更新完毕。希望大家耐心等等~
在这里插入图片描述

  今天这篇文章想重点给大家讲讲关于项目中安全扫描漏洞会发现部分敏感信息明文传输后会被爬虫抓取导致信息泄漏的问题,那么我们就需要将信息加密传输,解密展示。下面开始我们的内容吧,希望对大家的开发会有很大的帮助

RSA是什么

  RSA加密算法是一种非对称加密算法,使用一对密钥:公钥和私钥。这些密钥实际上是一组数字,长度通常为1024位或2048位。密钥越长,加密强度越高,但加解密所需时间也越长。因此,应根据信息的敏感性、攻击难度和系统响应时间来综合选择合适的密钥长度。

RSA如何加解密

  1. 基本原理
      RSA本质上其实就是两个公式,在了解公式之前我们先了解几个数论中的概念:互质、欧拉函数、欧拉定理、模反元素,因为csdn上面有很多内容会对该内容进行详尽的解释,有想要了解的小伙伴可以对该内容仔细研读,这里就不再进行介绍了,具体我们来看一下其原理:
      公钥加密:任何人可以使用公钥加密信息。
      私钥解密:只有拥有私钥的人才能解密加密的信息。
    那么,如何生成密钥呢?
// 1、选择两个大素数p和q。
// 2、计算n
	n= p*q
// 3、计算欧拉函数 ϕ(n)
	ϕ(n) = (p-1)(q-1)
// 4、选择公钥指数e
	e与ϕ(n)互质,且1<e<ϕ(n)
	常用的选择是e = 65537
// 5、计算私钥指数 d
	d 是 e 关于 ϕ(n) 的模反元素,即满足:
	e×d≡1(modϕ(n))

以上是密钥的生成过程,了解此项原理之后 我们开始进入RSA的加解密过程:
2. RSA加密过程
先来看公式:使用公钥 (n,e) 将明文 m 加密为密文 c
在这里插入图片描述
3. RSA解密过程
使用私钥 d 将密文 c 解密为明文 m:
在这里插入图片描述
4. RSA密钥对生成
通过上述步骤生成公钥和私钥。
使用jsencrypt生成密钥对

const crypt = new JSEncrypt({ default_key_size: 2048 });
const publicKey = crypt.getPublicKey();
const privateKey = crypt.getPrivateKey();

加密和解密示例

使用jsencrypt进行RSA加密和解密

import JsEncrypt from 'jsencrypt/bin/jsencrypt.min.js'//项目中需要下载JsEncrypt
const publicKey = `-----BEGIN PUBLIC KEY-----YOUR_PUBLIC_KEY_HERE-----END PUBLIC KEY-----`
const privateKey = `-----BEGIN PRIVATE KEY-----YOUR_PRIVATE_KEY_HERE-----END PRIVATE KEY-----`;
const crypt = new JSEncrypt();
crypt.setPublicKey(publicKey);
const encrypted = crypt.encrypt("Hello, RSA!");
crypt.setPrivateKey(privateKey);
const decrypted = crypt.decrypt(encrypted);

加密选项和参数:

  • 密钥长度:通常为2048位或更高。
  • 填充模式:常用PKCS#1 v1.5或OAEP。

那么如何在axios中封装一个关于加解密的示例呢?

const axios = require('axios');
const JSEncrypt = require('jsencrypt');

// 创建 JSEncrypt 实例
const encryptor = new JSEncrypt();
const decryptor = new JSEncrypt();

// 设置公钥和私钥
const publicKey = `-----BEGIN PUBLIC KEY-----YOUR_PUBLIC_KEY_HERE-----END PUBLIC KEY-----`;
const privateKey = `-----BEGIN PRIVATE KEY-----YOUR_PRIVATE_KEY_HERE-----END PRIVATE KEY-----`;

encryptor.setPublicKey(publicKey);
decryptor.setPrivateKey(privateKey);

// 创建 Axios 实例
const api = axios.create({
    baseURL: 'https://api.example.com',
});
// 添加请求拦截器进行加密--我们统一将请求参数中需要加密的数据加上'_ESA'后缀
api.interceptors.request.use((config) => {
    if (config.data) {
        for (const key in config.data) {
            if (key.endsWith('_ESA')) {
                const originalKey = key.slice(0, -4);
                config.data[originalKey] = encryptor.encrypt(config.data[key]);
                delete config.data[key];
            }
        }
    }
    return config;
}, (error) => {
    return Promise.reject(error);
});

// 添加响应拦截器进行解密
api.interceptors.response.use((response) => {
    if (response.data) {
        for (const key in response.data) {
        //我们统一将请求参数中需要加密的数据加上'_DESA'后缀
            if (key.endsWith('_DESA')) {
                const originalKey = key.slice(0, -5);
                response.data[originalKey] = decryptor.decrypt(response.data[key]);
                delete response.data[key];
            }
        }
    }
    return response;
}, (error) => {
    return Promise.reject(error);
});

// 示例请求
api.post('/secure-endpoint', {
    username_ESA: 'user123',
    password_ESA: 'mysecretpassword', // 这些参数会被加密
})
.then(response => {
    console.log(response.data);
})
.catch(error => {
    console.error(error);
});

这样一个简单的封装就完成啦

应用场景

  • 数字签名:通过加密技术验证数据的来源和完整性,常用于软件分发和电子合同签署。
  • 数据加密传输:对敏感文件进行加密,以防止未经授权的访问。常用于企业数据保护和个人隐私保护
  • 身份验证:使用加密算法存储和验证用户密码,确保密码安全
  • 数字货币和区块链:加密技术是数字货币(如比特币)和区块链技术的基础,用于确保交易的安全性和匿名性
  • 移动支付和金融交易:在移动支付和在线交易中使用加密技术保护用户的金融信息和交易数据
  • 访问控制:通过加密技术实现对系统和数据的访问控制,确保只有授权用户才能访问特定资源

性能和限制

1、性能

  • 计算复杂度

RSA加密和解密操作涉及大整数的指数运算,计算复杂度较高
加密速度通常比解密快,因为加密使用较小的公钥指数(如3或65537),而解密使用较大的私钥指数

  • 密钥长度

密钥长度越长,安全性越高,但计算复杂度也越高。
常用的密钥长度为2048位或以上,以平衡安全性和性能

  • 数据大小限制

RSA只能加密比密钥长度小的数据块(通常是密钥长度减去一些填充的开销
RSA通常用于加密对称密钥,而不是直接加密大数据

2、限制

  • 效率问题

由于计算复杂度高,RSA不适合加密大块数据
通常结合对称加密算法(如AES)使用,RSA加密对称密钥,对称算法加密实际数据

  • 填充方案

需要使用填充方案(如PKCS#1 v1.5或OAEP)来确保安全性,防止某些攻击

  • 量子计算威胁

量子计算机可能会破坏RSA的安全性,Shor算法能够有效分解大整数

  • 密钥管理

私钥需要安全存储,防止泄露。
公钥需要可靠分发,防止中间人攻击

问题排查和常见错误

1、密钥生成错误:

确保使用可靠的库生成密钥对。
验证密钥长度是否符合安全标准(如2048位或以上)。

2、加解密失败:

检查公钥和私钥是否匹配。
确保加密时使用公钥,解密时使用私钥。

3、填充错误:

确保使用正确的填充方案(如PKCS#1 v1.5或OAEP)。
加密和解密时必须使用相同的填充方式。

4、数据长度超出限制:

确认加密的数据长度小于密钥长度减去填充开销。
对于较大数据,考虑使用混合加密方案。

5、字符编码问题:

确保在加解密过程中使用一致的字符编码(如UTF-8)。
处理二进制数据时,注意使用Base64或Hex编码进行传输。

6、无效的密钥格式:

确保密钥格式正确(如PEM或DER格式)。
检查密钥是否被截断或损坏。

总之,RSA是一个强大的加密工具,但需要谨慎实现和管理,以确保其安全性和有效性。未来,随着量子计算的发展,可能需要转向抗量子算法来保持数据安全。
今天的分享就到这里啦,如果有需要的小伙伴记得关注点赞评论哦~
在这里插入图片描述

JSEncrypt 是一个用于在浏览器端通过 JavaScript 实现 RSA 加密和解密操作的库。它允许开发者方便地对数据进行加密处理,确保敏感信息在网络传输过程中的安全性。 **JSEncrypt 解密流程** 使用 JSEncrypt 进行解密的基本步骤如下: 1. **引入库文件** 首先需要将 JSEncrypt 库加载到项目中,可以使用 CDN 或下载本地引用的方式引入该库。 2. **实例化 JSEncrypt 对象并设置私钥** 使用 `new JSEncrypt()` 创建一个新的 JSEncrypt 实例,并通过 `.setPrivateKey(privateKey)` 设置好对应的私钥字符串(通常是从服务端获取)。注意这里要用的是 PEM 格式的私钥文本内容。 3. **执行解密操作** 调用 `.decrypt(encryptedData)` 方法传入待解密的数据即可得到明文结果。 以下是简单的代码示例说明如何完成上述三个步骤: ```html <script src="https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/3.0.0-rc.1/jsencrypt.min.js"></script> <script type="text/javascript"> // 私钥 (简化版) var privateKey = "-----BEGIN PRIVATE KEY-----\nMIICeAIBADANBgkqhkiG9w0BAQEFAASCAmcwgg..." // 初始化 JSEncrypt 并设值私钥 const crypt = new JSEncrypt(); crypt.setPrivateKey(privateKey); // 已经被加密过的 Base64 编码后的数据串 let encryptedString = 'MIGfMA...'; try { console.log("Decrypted:", crypt.decrypt(encryptedString)); } catch(e) { console.error('Decrypt failed:', e); } </script> ``` 需要注意的一点是,在实际应用环境中为了保证更高的安全等级,应该避免直接暴露完整的私钥给前端用户;另外由于 RSA 算法本身效率较低不适合大批量消息加解密任务,所以有时会在业务场景里配合 AES 等其他高效算法一起工作,即所谓的混合加密模式。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值