目录
接着上一篇 《千亿级互联网平台背后那些事-欲上青天揽明月》,今天我们来聊一聊关于用户隐私信息的事。
随着时代及互联网的发展,人们对个人隐私越来越重视,但隐私信息泄露及滥用的问题依然屡见不鲜。之前有一份《中国个人信息安全和隐私保护报告》曾抽取100万份调查数据,80%用户遭遇隐私泄露,还比如万豪在18年遭遇3.83亿隐私数据泄露后于2020年3月31日再次爆出520万客户信息泄露。这背后的缘由咱们就不做多讲,除了一些流氓公司的恶意行为,肯定还有很多的商业利益的驱使。今天我们来聊一聊开发人员该如何处理用户隐私,想起半年前在知乎上爆出的某省普通话水平测试查询系统开发人员把身份证直接写在了js里,有网友笑称这才是真正的前后端分离,支撑亿级并发完全不是事。
文章开始之前,先抛出一个小问题:除了姓名、身份证、银行卡、手机号外,你觉得还有哪些是用户的敏感信息,需要加密存储?
什么叫个人信息,哪些又算敏感信息?个人信息该如何存储,又该如何展示?游戏中的兑换码是不是敏感信息?住宿信息是不是敏感信息??作为一名优秀的开发人员,我们不能把目光仅仅聚焦在代码上,不能永远是产品经理或者项目经理让我这么做,还应该掌握所在行业的业务知识,包括法律及政策规范等,提升拓宽我们的业务知识面。
一、用户信息安全规范
关于信息系统建设这一块,国家及行业其实有很多的标准和规范的,比如国家标准全文公开系统(http://openstd.samr.gov.cn/))。关于个人信息,最新的是今年发布的《GB/T 35273-2020 信息安全技术-个人信息安全规范 》,将于2020-10-01正式实施,取代老的标准GB/T 35273-2017。 整个规范文档主要体现了七大原则:权责一致原则、目的明确原则、选择同意原则、最少够用原则、公开透明原则、确保安全原则、主体参与原则。
1.1 用户信息、敏感信息定义及判断依据
1.1.1 个人信息
个人信息,personal information。指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。
判定方式:
- 识别:即从信息到个人,由信息本身的特殊性识别出特定自然人,个人信息应有助于识别出特定个人。
- 关联:即从个人到信息,如已知特定自然人,由该特定自然人在其活动中产生的信息(如个人位置信息、个人通话记录、个人浏览记录等)即为个人信息。
符合上述两种情形之一的信息,均应判定为个人信息。
个人信息举例:
注:个人信息控制者通过个人信息或其他信息加工处理后形成的信息,例如,用户画像或特征标签,能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的,也属于个人信息。
1.1.2 个人敏感信息
个人敏感信息,personal sensitive information。指一旦泄露、非法提供或滥用可能危害人身和财产安全,极易导致个人名誉、身心健康受到损害或歧视性待遇等的个人信息。通常情况下,14岁以下(含)儿童的个人信息和涉及自然人隐私的信息属于个人敏感信息。
判定方式:
-
泄露:个人信息一旦泄露,将导致个人信息主体及收集、使用个人信息的组织和机构丧失对个人信息的控制能力,造成个人信息扩散范围和用途的不可控。某些个人信息在泄漏后,被以违背个人信息主体意愿的方式直接使用或与其他信息进行关联分析,可能对个人信息主体权益带来重大风险,应判定为个人敏感信息。例如,个人信息主体的身份证复印件被他人用于手机号卡实名登记、银行账户开户办卡等。
-
非法提供:某些个人信息仅因在个人信息主体授权同意范围外扩散,即可对个人信息主体权益带来重大风险,应判定为个人敏感信息。例如,性取向、存款信息、传染病史等。
-
滥用:某些个人信息在被超出授权合理界限时使用(如变更处理目的、扩大处理范围等),可能对个人信息主体权益带来重大风险,应判定为个人敏感信息。例如,在未取得个人信息主体授权时,将健康信息用于保险公司营销和确定个体保费高低。
个人敏感信息举例
注:个人信息控制者通过个人信息或其他信息加工处理后形成的信息,如一旦泄露、非法提供或滥GB/T 35273—20206用可能危害人身和财产安全,极易导致个人名誉、身心健康受到损害或歧视性待遇等的,属于个人敏感信息。
1.2 用户信息存储的注意事项
- 个人信息存储时间最小化,超过个人信息存储期限后,应对个人信息进行删除或匿名化处理。
- 传输和存储个人敏感信息时,应采用加密等安全措施;采用密码技术时宜遵循密码管理相关国家标准。
- 个人生物识别信息应与个人身份信息分开存储;
- 原则上不应存储原始个人生物识别信息(如样本、图像等),可采取的措施包括但不限于:仅存储个人生物识别信息的摘要信息;在采集终端中直接使用个人生物识别信息实现身份识别、认证等功能; 在使用面部识别特征、指纹、掌纹、虹膜等实现识别身份、认证等功能后删除可提取个人生物识别信息的原始图像。
整个规范文件中,还提到了用户信息的使用、展示、第三方接入、安全管理等等,有兴趣的小伙伴可以自定搜索了解一下。
二、框架技术实现
2.1 用户敏感信息自动加解密
正如第一章节提到的,用户的真实姓名、手机号、银行卡号、包括住宿等敏感信息需要加密存储到数据库中,业务正常使用的时候再转化为明文数据。从技术实现角度来看,无非就是新增、编辑时进行加密,查询时解密,这样一个个操作起来还是比较low的,而且很可能哪天新增了一个方法又忘记加解密了。所以大部分会通过框架来实现,实现的原理无外乎反射机器+拦截器。接下来以Mybatis为例,原理如下图,具体可参考:https://blog.csdn.net/weixin_39494923/article/details/91534658
2.1.1 通过Interceptor实现数据的自动加解密
Mybatis默认提供了一个拦截器接口Interceptor,大部分Mybatis的增强工具都是通过该接口实现的。如果要实现自定义的拦截器,只需要实现 org.apache.ibatis.plugin.Interceptor 接口,该接口有三个方法:
Object intercept(Invocation invocation) throws Throwable;
Object plugin(Object target);
void setProperties(Properties properties);
首先以自定义一个注解@Crypt,作用在字段上,用于告诉拦截器那个字段需要加解密。
@Target({
ElementType.FIELD,ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface Crypt {
}
接下来添加一个自定义拦截器,selelct方法时进行解密,update和add方法时进行加密。
@Intercepts({
@Signature(type = Executor.class, method = "update", args = {
MappedStatement.class, Object.class, }),
@Signature(type = Executor.class, method = "query", args = {
MappedStatement.class, Object.class,
RowBounds.class, ResultHandler.class }),
@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {
Statement.class }) })
public class CryptInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object[] args = invocation.getArgs();
if (args.length <= 0 || invocation.getMethod() == null || args[0] == null) {
return invocation.proceed();
}
String methodName = invocation.getMethod