1. RSA加密原理与密钥对生成
RSA加密算法是现代网络安全通信的基石之一,它的安全性基于大整数分解的数学难题。简单来说,RSA通过一对数学上关联的密钥(公钥和私钥)来实现加密和解密操作。
密钥生成的核心步骤其实就像在玩一个数字游戏:
- 随机选择两个足够大的质数p和q(通常建议1024位以上)
- 计算它们的乘积n = p × q
- 计算欧拉函数φ(n) = (p-1)(q-1)
- 选择一个与φ(n)互质的整数e作为公钥指数
- 计算私钥指数d,使得d × e ≡ 1 mod φ(n)
在实际开发中,我们不需要手动实现这些数学运算。以Java为例,使用Hutool工具库生成密钥对简直易如反掌:
// 生成2048位的RSA密钥对
KeyPair pair = SecureUtil.generateKeyPair("RSA", 2048);
// 获取Base64编码的公钥和私钥
String publicKey = Base64.encode(pair.getPublic().getEncoded());
String privateKey = Base64.encode(pair.getPrivate().getEncoded());
提示:密钥长度直接影响安全性,2048位是当前推荐的最小长度。但要注意,密钥长度每增加一倍,生成时间可能增加16倍,加解密耗时也会显著上升。
2. 前端加密实战(Vue+JSEncrypt)
现代前端框架配合加密库可以轻松实现密码的安全传输。以Vue项目为例,我们需要先安装JSEncrypt库:
npm install jsencrypt
然后在登录组件中实现加密逻辑:
import JSEncrypt from 'jsencrypt'
// 加密函数
function encryptPassword(password) {
const encryptor = new JSEncrypt()
// 这里替换为你的实际公钥
const publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1SU1LfVLPHCozMxH2Mo
...省略部分密钥内容...
QIDAQAB
-----END PUBLIC KEY-----`
encryptor.setPublicKey(publicKey)
return encryptor.encrypt(password)
}
// 在登录提交时调用
async function handleLogin() {
const encryptedPwd = encryptPassword(form.password)
await loginApi({
username: form.username,
password: encryptedPwd
})
}
常见踩坑点:
- 公钥格式必须包含
-----BEGIN PUBLIC KEY-----头尾标记 - 加密后的密文每次结果不同(RSA的Padding机制导致),这是正常现象
- 移动端需要考虑性能问题,长文本加密可能导致卡顿
3. 后端解密实现(Java+Hutool)
后端收到加密数据后,需要用私钥解密。Hutool提供的RSA工具类让这个过程变得非常简单:
import cn.hutool.crypto.asymmetric.RSA;
public class RsaUtils {
private static final String PRIVATE_KEY = "你的私钥内容";
public static String decrypt(String encryptedText) {
RSA rsa = new RSA(PRIVATE_KEY, null);
return rsa.decryptStr(encryptedText, KeyType.PrivateKey);
}
// 在Controller中使用
@PostMapping("/login")
public Result login(@RequestBody LoginDto dto) {
String realPassword = RsaUtils.decrypt(dto.getPassword());
// 后续验证逻辑...
}
}
性能优化技巧:
- 将RSA实例声明为静态变量,避免每次解密都重新初始化
- 对于高并发场景,可以考虑使用线程安全的RSA实例池
- 敏感接口建议添加防重放攻击机制
4. 完整登录流程改造案例
让我们看一个完整的登录接口加密改造方案:
前端改造点:
- 登录页引入JSEncrypt库
- 密码输入框增加加密处理
- 提交时对密码字段单独加密
后端改造点:
- 添加RSA工具类
- 修改登录接口的解密逻辑
- 增加日志脱敏处理(避免密文打印到日志)
安全增强建议:
- 每次会话使用临时密钥对(更安全但实现复杂)
- 结合HTTPS传输层加密
- 对频繁失败的解密请求进行限流
// 增强版的RSA工具类
public class EnhancedRsaUtil {
private static final Map<String, RSA> keyPairCache = new ConcurrentHashMap<>();
public static String decrypt(String encryptedText, String privateKey) {
try {
RSA rsa = keyPairCache.computeIfAbsent(
privateKey,
pk -> new RSA(pk, null)
);
return rsa.decryptStr(encryptedText, KeyType.PrivateKey);
} catch (Exception e) {
throw new BusinessException("解密失败,请检查密钥是否正确");
}
}
}
在实际项目中,我们还会遇到各种边界情况,比如:
- 密钥过期轮换机制
- 多平台密钥统一管理
- 加密数据的历史兼容问题
这些问题的解决方案往往需要根据具体业务场景来设计。比如金融类应用可能需要更严格的密钥管理制度,而内部管理系统则可以适当简化。
1359



被折叠的 条评论
为什么被折叠?



