(未完成)
本文讨论下,业务数据如何签名验签、加解密。
为什么要做这件事?
理想目标:防篡改,防抵赖,防窃听。
理想目标,可以有损实现。
要考虑的一些点:
- 对哪些字段签名?是部分字段还是所有字段?
- 对哪些字段加密?是各个字段单独加密,还是所有字段都加密?
- 如何保证业务开发友好?
- 调用方和服务方协议出现不一致(例如版本不一致导致的两边字段数量不一致),如何保证验签和解密无问题 ?
- 评估各种签名、加解密算法的安全级别和性能。
- 更新密钥时,要不要平滑过渡?
- 是基础组件做?还是业务层做?
- 响应数据是否做签名?防止服务方被劫持。
- 调用方要不要对响应做一些关键信息校验。如把一个随机字符串传到服务方,服务方原样返回。
- 要不要加上请求时间校验,请求数据加上时间戳。服务方只处理最近上下5分钟的请求。
- 数据加密是对称加密?还是非对称加密?
- 如果是非对称加密,是调用方生成公私钥,还是服务方生成?调用方生成,可以防抵赖,但破坏了调用方体验。
- 如果只做签名,是否对签名做非对称加密,以防抵赖?
- 各种方案的性能如何?开发是否友好?测试是否友好?
经典案例
微信支付的协议是一个经典的案例。