什么是RSA加密
RSA加密是一种在前端(通常是在浏览器中)进行的非对称加密方法;RSA是一种公开密钥加密算法,包含两个密钥:公开密钥和私有密钥。通过前端RSA加密,可以在客户端对敏感数据进行加密,然后将加密后的数据发送到服务器。
使用RSA加密的一般步骤:
-
生成密钥对:首先使用RSA算法生成一个密钥对,包含一个公开密钥和一个私有密钥。公开密钥用于加密数据,私有密钥用于解密数据。
-
分发公开密钥:服务器将生成的公开密钥发送给客户端。
-
客户端 加密 数据:客户端使用从服务器接收到的公开密钥对要传输的数据进行加密。
-
数据传输:客户端将加密后的数据发送给服务器。
-
服务器 解密数据:服务器使用它的私有密钥对接收到的加密数据进行解密,得到原始数据。
项目中实践
JSEncrypt 库通常基于 RSA 算法, 通常是服务端同学把公钥给到我们前端进行加密,我们把加密后的内容发送给服务端进行解密;
import JSEncrypt from "jsencrypt"; // 引用包
const devPublicKey = `-----BEGIN PUBLIC KEY-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALm5F6cLhsY9kzVYZaHjnVZLkcG/zaeaTBkB769z4o1naAuYJBvu8TaFa1O9Uc0t0NLb6l0ONYydeUPu5ewV9IMCAwEAAQ==-----END PUBLIC KEY-----`;
const rsa = new JSEncrypt(); // 创建实例
rsa.setPublicKey(devPublicKey); //设置公钥
const res = rsa.encrypt(content); // 对内容进行加密
FAQ
加密超长邮箱时 为什么会导致失败?
首先明确 RSA 的消息长度限制是由于公钥加密的固有特性引起的;
RSA 的密钥大小(key size)直接影响能加密的最大数据块大小;
RSA 密钥大小与 加密 数据块的关系
| 秘钥大小(Key Size) | 最大加密数据大小 | 适用场合 |
|---|---|---|
| 512-bit | 53 bytes | 已不再推荐使用,安全性不足。 |
| 1024-bit | 1. 117 bytes | 基本可以用于加密较短的字符串,同样安全性在现代应用中不推荐。 |
| 2048-bit | 245 bytes | 推荐使用,安全性较高,更适合长期数据保护 |
常见字符集的字节数
-
ASCII(包括常见英文字符和数字) :每个字符占 1 byte
-
UTF-8(包括多语言字符) :
-
多数英文字符和数字:每个字符占 1 byte
-
部分特殊字符和汉字:每个字符占 2-4 bytes
-
通过以上内容可知:
此次bug 导致的原因就是服务端同学提供给我们的 公钥 过小导致 ;
解决方案:
-
限制内容输入字符数,建议 40 以内比较安全
-
服务端同学生成更大的公钥提供给我们
Online RSA Key Generator: