产品中最有价值的就是数据了,以前对数据保护只是在保护的静态数据,比如数据库、文件。现在的数据保护是保护整个生命周期,是包括动态数据。这里主要就数据存储、数据传输、数据展示这些阶段如何保证数据安全。
数据存储安全
要保证数据安全,自然是将数据进行加密,也就带来一些问题:
- 加密也是很消耗性能的,那是要对所有的数据都加密吗?
- 还有就是加密的密钥应该如何存储才能保证安全性呢?
- 数据加密后要如何进行查询呢?
- 加密的方案要如何选择呢?是选择字段加密还是静态加密
如何选择加密方式
针对结构化的数据,加密方式主要有:
字段加密是指在应用层加密后再写入数据库,数据库管理员通过控制台查询,看到的也是密文,因此字段加密的安全性高,可以防DBA(数据库管理员)。
静态加密通常是指存储侧自动完成的底层加密,开发人员不用关注底层加密细节,继续按照之前未加密的方式进行读写,应用层看到的是明文,数据库管理员通过控制台查询,看到的也是明文,不能防DBA。
每种方式又有两种管理秘钥的方式:
自管理秘钥
配合 KMS(秘钥管理系统)管理秘钥 这几种方式主要是防止黑客获取数据库文件后导致的数据泄露,下面为各个方式的对比
这几种方式主要是防止黑客获取数据库文件后导致的数据泄露,下面为各个方式的对比
安全性要求高的方式:字段加密方式 + KMS 密钥管理方式。
所有数据都要加密么?
结合当前的各项监管政策和国际、国内的合规要求,以及加解密对业务场景的适配度,建议如下
- 敏感个人信息以及涉及个人隐私的数据、UGC(User Generated Content,用户生产内容)数据,需要加密存储。
- 口令、加解密密钥、私钥,需要加密存储(其中不需要还原的口令需要使用单向散列算法)。
- 有明确检索、排序、求和等运算需求的业务数据,不需要加密存储。
- 其他场景则需要结合业务实际情况进行判断。
加密后的数据如何查询
如果直接对加密后的数据进行检索,得不到对应的结果。我们可以对要查询的数据加上关键字字段,用于缩小范围辅助查询。
比如 我们需要查询地址的用户,可以提供 省、市、区、街道这些不加密的字段,得到对应的用户再进行解密确认具体的用户信息,从而得到住在具体地址的用户。
比如 查询手机号时,我们可以加上运行商、归属地、号码前 3 位等字段,缩小查询范围。
数据传输安全
有时候我们访问一个网站,而这个网站有不和谐的元素,加塞了一堆的广告,有可能这个网站被劫持了。这个主要原因就是使用的 http 应用协议,而不是 https。
数据传输安全的机制有两种:
- 应用层数据加密,通道不加密:直接在不安全的网络上传输加密后的数据。
- 应用层数据不加密,通道加密:就是使用带有 SSL 协议的应用层协议。
所谓的前向安全,就是在长期密钥(或称为主密钥)泄露之后,虽然不能保证后期的数据安全,但是对过去的数据安全没有影响
数据展示与脱敏
数据脱敏,即按照一定的规则对数据进行变形、隐藏或部分隐藏处理,让处理后的数据不会泄露原始的敏感数据,实现对敏感数据的保护。
以手机号为例,某个脱敏后的手机号可能为138 ***** 010(用*代替部分数字)。在需要展示一些比较敏感的数据,特别是个人信息的时候,需要执行严格的脱敏,防止用户个人信息泄露。展示的位置包括网页、PC客户端软件、手机APP等。
如果业务 A 使用的脱敏方式是 138 0133* ***,而业务 B 使用的脱敏方式是 138 **** 8010 将这两个组合起来就可以知道该用户的手机号了,所以在这里需要统一脱敏方式。
《个人信息保护法(草案)》:个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别自然人个人身份的各种信息,包括但不限于自然人的姓名、出生日期、身份证件号码、个人生物识别信息、住址、电话号码等.
什么时候进行脱敏呢?
接口层面上:应该在流出数据接口时进行脱敏,如果只是在前端使用 Javascript 进行脱敏,黑客可以直接调用接口获取脱敏前的数据,那么这个脱敏就有点像掩耳盗铃的感觉了。所以要在后端获取数据之后就直接脱敏。
数据库层面上:可以通过创建视图的方式进行脱敏,比如从生产环境中流出一部分数据给测试环境,不提供敏感字段查询,如下图所示:
如何展示敏感信息?
如果真的需要提供对应的敏感数据,可以通过 K-匿名 等去标识化的隐私保护技术手段,防止个人信息泄露。
如果真的需要提供明文数据,比如员工要查询其他同事的手机号,需要联系对方,或者客服要核对用户身份,这时可以通过二次点击的方式查询,并给对方发送对应的消息。
还有一种就是限制查询的次数,比如我们在查询征信的时候,限制每天可以查看的次数。
数据真假鉴别
数据在通过网络传递的过程中,接收方应该如何确认收到的数据没有被篡改呢?
- 单向散列(hash),多用于文件下载,用户通过把下载文件的散列值跟网站上公布的散列值进行比对来判断文件是否被篡改;当然这里的散列算法要排除掉MD5、SHA-1等已经出现碰撞的算法,推荐SHA-256或更强的算法.
- HMAC,多用于后台消息传递时的完整性校验,但对消息本身没有加密保护。
- AES-GCM,在保障身份认证、数据加密的同时,提供完整性保障
- 数字签名(即使用私钥加密),由于篡改后会导致无法解密,从而也保障了完整性。
总结
要保证资产安全,首先保证数据自身的安全,就是要加密存储、加密传输、加密展示(脱敏)其次就是控制数据的暴露面
- 数据不是所有人都可以访问,那就是权限控制。
- 数据即使被访问也需要限制次数