java - 如何使用 RSA 加密来加密 http 响应
问题描述
我正在开发一个使用 RSA 加密来加密请求响应的 Web 服务。我已经与客户端共享了公钥,并且可以使用我的私钥解密传入的请求。现在我的问题是如何加密要返回给客户端的响应。我有两个选择:
(1) 使用我的私钥加密响应,客户端将使用已经共享的公钥对其进行解密。
(2) 要求客户提供他们的公钥并用该公钥加密响应。
请建议使用哪种策略来加密响应?
解决方案
您不能使用私钥加密,因为公钥应该是公开的。使用私钥加密本质上是不安全的,编程 API 通常不允许使用它。
所以(2)实际上是唯一的选择:让客户公钥并让他们用私钥解密。然而,这并不是故事的全部:
- 公钥需要被信任,您可能需要设置一个完整的 PKI 来信任这些密钥;
- 较大的消息无法使用 RSA 轻松加密,因此您可能需要混合加密(加密随机 AES 密钥并使用该密钥加密消息);
- padding oracle 攻击是非常真实的,并且确实适用于 RSA,因此仅执行 RSA 是非常危险的。
这就是为什么通常建议(仅)依赖 TLS 的原因。TLS 并不总是安全的,但它几乎总是比自制方案更安全。
推荐阅读
- android - RxJava Mockito 测试中的 NPE(source2 为 null)
- c# - 如果 Count = 0,C# 清除列表
- google-apps-script - 在工作表有更新之前运行的脚本
- c++builder - 如何从 .hpp 跳转到实际的源代码 (.pas) 文件?
- c# - 违反主键约束重复键
- python - 无法将梁 python pcollection 转换为列表
- python - 执行迁移时出现 valueError
- sql - 访问转换多值字段表
- python-3.x - Youtube API 'nextPageToken' 在'使用 order=relevance' 时中断
- javafx - 带有瓷砖 FXML 的背景布局