当前位置:首页 » 《随便一记》 » 正文

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

2 人参与  2024年12月14日 16:01  分类 : 《随便一记》  评论

点击全文阅读


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

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

RSA是什么

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

RSA如何加解密

基本原理
  RSA本质上其实就是两个公式,在了解公式之前我们先了解几个数论中的概念:互质、欧拉函数、欧拉定理、模反元素,因为csdn上面有很多内容会对该内容进行详尽的解释,有想要了解的小伙伴可以对该内容仔细研读,这里就不再进行介绍了,具体我们来看一下其原理:
  公钥加密:任何人可以使用公钥加密信息。
  私钥解密:只有拥有私钥的人才能解密加密的信息。
那么,如何生成密钥呢?
// 1、选择两个大素数p和q。// 2、计算nn= p*q// 3、计算欧拉函数 ϕ(n)ϕ(n) = (p-1)(q-1)// 4、选择公钥指数ee与ϕ(n)互质,且1<e<ϕ(n)常用的选择是e = 65537// 5、计算私钥指数 dd 是 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'//项目中需要下载JsEncryptconst 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是一个强大的加密工具,但需要谨慎实现和管理,以确保其安全性和有效性。未来,随着量子计算的发展,可能需要转向抗量子算法来保持数据安全。
今天的分享就到这里啦,如果有需要的小伙伴记得关注点赞评论哦~
在这里插入图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/201215.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1