1. RSA非对称加密的核心价值与应用场景
在当今互联网应用中,数据安全传输始终是开发者面临的首要挑战。想象这样一个场景:你的后端服务需要向移动客户端下发包含用户隐私数据的许可证文件,如果采用传统的对称加密(如AES),虽然加解密速度快,但密钥需要在两端共享,一旦密钥在传输过程中被截获,整个加密体系就会崩溃。这正是RSA非对称加密大显身手的地方。
RSA算法最精妙的设计在于它使用一对数学关联的密钥:公钥可以自由分发,而私钥必须严格保密。在我们的工具类实现中,特别采用了"私钥加密+公钥解密"的模式,这种设计特别适合以下企业级应用场景:
- 许可证分发系统:服务端用私钥加密授权信息,客户端用预置的公钥解密验证。即使公钥被反编译获取,攻击者也无法伪造加密数据(因为缺少私钥)
- API调用验签:服务端用私钥加密时间戳,客户端解密后验证请求时效性,防止重放攻击
- 敏感配置下发:数据库连接信息等敏感配置通过私钥加密后存储,运行时用公钥解密
关键安全原则:私钥必须存储在服务端安全区域(如AWS KMS、HashiCorp Vault或加密的配置文件),绝对不要硬编码在源码或放入版本控制系统。我们工具类中生成的Base64编码密钥也应遵循此原则。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 密钥生成与加密原理解析
2.1 密钥对的数学基础
RSA算法的安全性建立在大数分解难题上。当使用2048位密钥时,相当于要分解一个617位的十进制数(约2^2048)。工具类中generateRSAKeyPair()方法的本质是:
- 随机选择两个大素数p和q(通常使用
SecureRandom) - 计算模数n = p × q
- 计算欧拉函数φ(n) = (p-1)(q-1)
- 选择公钥指数e(通常为65537)
- 计算私钥指数d ≡ e⁻¹ mod φ(n)
java复制// 密钥生成核心代码解读
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048); // 安全红线:低于2048位的密钥不应在生产环境使用
KeyPair keyPair = keyPairGen.generateKeyPair();
2.2 分段加密的必要性
由于RSA算法特性,加密数据长度受密钥长度限制。我们的工具类通过MAX_ENCRYPT_BLOCK常量(245字节)实现自动分段:
- 输入数据按245字节分块
- 每块单独用PKCS1Padding填充加密
- 拼接所有加密块后做Base64编码
java复制// 分段加密流程示例
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offset = 0;
while (inputLen - offset > 0) {
int len = Math.min(inputLen - offset, MAX_ENCRYPT_BLOCK);
byte[] encryptedBlock = cipher.doFinal(plainBytes, offset, len);
