客户端通过http协议获取系统重要敏感信息时,很容易造成敏感信息泄露。攻击者可以利用收集的重要敏感信息有针对性的制定计划对系统进行攻击。如何防护呢?首先应根据业务特点定义出系统存储的敏感信息,另外敏感信息在存储、传输、显示时应进行加密或脱敏处理。
1、敏感数据上传
客户端将敏感数据加密后上传至服务端,敏感信息Data采用对称加密算法进行加密传输,对称加密密钥Key采用非对称加密传输。具体步骤如下所示。
1)服务端生成有效密钥对,并将PublicKey返回给客户端。公私钥在一个会话周期内有效,若重新登录或会话更新,则密钥对也要随之更新;
2)客户端生成一次有效密钥Key,用于对敏感数据Data对称加密,这样能有效防止本地js脚本泄露从而导致秘钥Key值泄露,密钥Key一次有效保证了即使获取本地js脚本,但不能破解其他客户端或其他请求的加密数据,因为每次数据加密的密钥key值是不同的;
3)客户端使用AES对称加密算法以及密钥Key对敏感字段加密,encryptdata=AES.encrypt(Data,Key);
4)客户端使用RSA非对称加密算法以及公钥PublicKey对密钥Key加密,encryptkey=RSA.encrypt(Key,PublicKey);
5)加密后的Data和Key以POST请求方式发送到服务端,Data=encryptdata&Key=encryptkey;
6)服务端接收到客户端发送的表单请求后,根据用户会话读取对应私钥PrivateKey,使用RSA+PrivateKey对encryptkey进行解密,得到Key=RSA.decrypt(encryptkey,PrivateKey);
7)服务端用步骤6得到的Key,使用AES算法对encryptdata进行解密得到原始敏感数据,Data=AES.decrypt(encryptdata,Key);
8)依据项目需求,对敏感数据Data作加密处理,调用统一的加解密算法存入数据库。
2、敏感数据查询
客户端从服务端读取敏感数据,在对数据加密传输的同时,对敏感数据进行脱敏处理。具体执行步骤如下所示。
1)服务端接收到客户端请求后,将请求的敏感数据从数据库取出;
2)服务端对数据库中的数据作解密得到原始数据Data;
3)服务端对敏感信息进行脱敏处理,使用*号替换原敏感信息字符的一部分,将脱敏后的数据传回给客户端;
4)若客户端需要查看完整敏感信息,发送二次请求查看数据原文;
5)服务端使用AES算法对原始数据Data进行对称加密并发送到客户端,对称加密密钥可以采用用户唯一标识USRID;
6)服务端从用户会话读取USRID,encryptdata=AES.encrypt(Data,USRID);
7)客户端接收到服务端的响应后,从前端读取USRID进行解密,Data=AES.decrypt(encryptdata, USRID),获取原始数据回显在客户端。
3、敏感数据显示
对敏感数据进行脱敏处理,脱敏的基本原则为保持原有数据特征,隐藏后的位数和隐藏前保持一致。敏感数据包括但不限于姓名、身份证号码、社会保险号码、信用卡号码、电子邮件地址、电话号码、邮政编码等。
脱敏隐藏方法如,姓名:隐藏姓氏,张三(*三)、张三水(*三水)、长孙无忌(**无忌);身份证号:隐藏后四位;信用卡、银行卡号码:显示前四位和后四位,中间全部隐藏;电子邮件:显示前三位、@及@后的字符,中间全部隐藏;电话号码:隐藏后四位。
另外在敏感信息处理方面,还应注意以下几点:
1)敏感信息不应使用GET方式提交到服务器;
2)口令为最高级敏感信息,在存储/传输/显示时都必须加密;
3)根据业务场景需要选择可靠的加密算法。
4)系统与第三方系统有交互时,应保证本系统页面调用本系统的接口,避免前端页面直接调用第三方服务接口。