“家贼难防”系列-密钥硬编码
越过昏晨线 便是永夜
道路千万条 密钥安全有三条
01
禁止密钥或认证凭证明文存储或硬编码保险箱的钥匙能带走就带走(服务端保存),不能带走的就找个别人拿不到的地方藏着(TEE、KeyStore或加密保存)。02
密钥需要使用安全随机数生成钥匙如果做得跟铁棍一样,那也就失去了意义,一把合格的钥匙一定需要是独一无二的!所以密钥材料需要确保不可预测性,推荐使用安全随机数(不懂可以问问度娘)生成,长度需要满足加密算法强度要求(下次看情况跟大家唠唠),包括但不限于IV、salt等。03
敏感数据需要加密传输或使用安全传输通道针对网络场景,若传输通道使用HTTP,敏感数据需要加密传输;使用HTTPS可明文传输敏感数据,不强制加密。讲白了就是加解密操作都是需要消耗时间和性能的,所以如果快递公司可靠,就没必要让快递员抱着保险箱来回跑了!自扫门前雪-本地密钥管理
由于密钥管理一直是移动终端设备的难点,系统层面也为此做出努力,从安卓4.3版本后支持KeyStore密钥管理,Android提供的这个KeyStore最大的作用就是不需要开发者去维护这个密钥的存储问题,相比起存储在用户的数据空间或者是外部存储器都更加安全。
注意的是这个密钥随着用户清除数据或者卸载应用都会被清除掉,而且不可导出,所以并不适合有密钥共享需求的业务。
安卓7.0版本后系统引入了TEE,使得一些敏感操作和敏感数据可以得到保障,但这并不能对低版本用户提供帮助。
注:关于KeyStore和TEE这个我就抛个砖,想了解的筒子们跟度娘多熟悉熟悉她就会知道了。
路见不平一声吼-基于客户端密钥上报方案
方案说明
1. 客户端使用安全随机数生成用于对敏感数据保护的加密密钥;
2. 如果密钥材料需要重复使用,不得明文存储(可明文保存在TEE环境),建议加密后保存;
3. 密钥上报需要通过安全传输通道,在使用安全传输通道的情况下(例如,HTTPS),可明文传输密钥;
4. 服务端拿到客户端上报的密钥后,可对客户端上传的敏感数据密文进行解密,对应客户端密钥需要加密保护;
5. 客户端上传的敏感数据如果需要持久化存储,不得将敏感数据明文或者直接将客户端加密的密文存于数据库,需要使用服务端重新生成的密钥或已有的非客户端密钥对敏感数据加密后保存,确保密钥泄露影响最小化。
方案特点
1. 本方案基于客户端密钥上报机制实施,适用于前后端共享密钥场景;
2. 适用于有网络交互相关业务场景,对于没有网络的应用不适用;
3. 由于是客户端生成上报密钥,密钥材料具有一机一密,不同应用密钥互不相同特征。
一方有难八方支援-基于服务端密钥下发方案
方案说明
2. 服务端推荐每次请求使用安全随机数生成待下发密钥(这样可以做到一机一密),或者使用系统先前已经生成的密钥下发给所有客户端(效果是一密多机,密钥可能无法由客户端触发更新)。两种方式的密钥都需要加密保护;
3. 密钥下发需要通过安全传输通道,在使用安全传输通道的情况下(例如,HTTPS),可明文传输密钥;
4. 客户端拿到密钥可以对敏感数据加密,加密后的数据密文服务端可使用留存的对应密钥进行解密;
5. 客户端上传的敏感数据如果服务端需要持久化存储,不得将敏感数据明文或者直接将客户端加密的密文存于数据库,需要使用服务端重新生成的密钥或已有的非客户端密钥对敏感数据加密后保存,确保密钥泄露影响最小化;
6. 如果客户端需要对密钥持久化,不得明文存储(可明文保存在TEE环境)。
方案特点
1. 本方案基于服务端密钥下发机制实施,适用于前后端共享密钥场景;
2. 适用于有网络交互相关业务场景,对于不需要网络的业务不适用;
3. 可实现一机一密和一密多机(不推荐,密钥泄露影响范围广)两种效果,其中一密多机可适用于不同客户端或应用共享密钥场景。
▼
更多精彩阅读
END
长按关注 最新动态