RPC 协议中的数据签名验签和加解密方案探讨


#软件架构与思考


(未完成)

本文讨论下,业务数据如何签名验签、加解密。

为什么要做这件事?

理想目标:防篡改,防抵赖,防窃听。

理想目标,可以有损实现。

要考虑的一些点:

  1. 对哪些字段签名?是部分字段还是所有字段?
  2. 对哪些字段加密?是各个字段单独加密,还是所有字段都加密?
  3. 如何保证业务开发友好?
  4. 调用方和服务方协议出现不一致(例如版本不一致导致的两边字段数量不一致),如何保证验签和解密无问题 ?
  5. 评估各种签名、加解密算法的安全级别和性能。
  6. 更新密钥时,要不要平滑过渡?
  7. 是基础组件做?还是业务层做?
  8. 响应数据是否做签名?防止服务方被劫持。
  9. 调用方要不要对响应做一些关键信息校验。如把一个随机字符串传到服务方,服务方原样返回。
  10. 要不要加上请求时间校验,请求数据加上时间戳。服务方只处理最近上下5分钟的请求。
  11. 数据加密是对称加密?还是非对称加密?
  12. 如果是非对称加密,是调用方生成公私钥,还是服务方生成?调用方生成,可以防抵赖,但破坏了调用方体验。
  13. 如果只做签名,是否对签名做非对称加密,以防抵赖?
  14. 各种方案的性能如何?开发是否友好?测试是否友好?

经典案例

微信支付的协议是一个经典的案例。

基于 Dubbo 的一个方案



( 本文完 )