📌 术语定义
用户数据(User Data) |
指用户拥有的数据,包括但不限于原始数据(用户输入的数据)、处理原始数据产生的数据(用户上线习惯、用户画像等)、系统运行产生的数据(音视频、图片、日志、事件等)。 |
隐私数据(Privacy Data) |
用户的机密/隐私信息以及个人的敏感数据。
|
数据主体(Data Subject) |
用户数据所标识的自然人或者拥有数据的组织或个人,包括但不限于个人、用户、第三方。 |
数据处理(Processing of Data) |
针对用户数据进行的操作行为:如采取收集、记录、组织、构造、存储、调整、更改、检索、咨询、使用、通过传输而公开、散布或其他方式对他人公开、排列或组合、限制、删除或销毁而公开等自动化方式。 |
生物性识别数据(Biometric Recognition Data) |
基于特别技术处理自然人的相关身体、生理或行为特征而得出的个人数据,这种个人数据能够识别或确定自然人的独特标识,例如脸部形象或指纹数据。 |
🔗 规范约束
安全设计原则
最小攻击面原则
系统每增加一个功能特性就有可能会引入新的风险,通过安全开发可以减少攻击面进而达到控制系统整体风险的目的。
-
增加了攻击条件(过滤输入)
-
减少了可以攻击的人数(功能鉴权)
-
删除无用功能(绝对避免)
权限最小化原则
-
系统只授予主体必要的权限,而不要过度授权,这样就能有效地减少系统、网络、应用、数据库出错的机会。
-
事物只拥有可以完成他们任务的最小权限,即不赋予不必要的权限。
-
包括但不限于:用户权限和资源权限(比如可以使用的CPU、内存、网络流量和存储容量等等)。
默认安全原则
-
在软件领域的含义就是:让默认的配置和策略尽可能的安全。如,许多场景,安全和产品体验经常会发生冲突,这时候应当选择安全优先,在安全的前提下,可以允许通过手动关闭安全配置或策略来提升产品体验。
-
如,默认打开密码复杂度策略,但产品可能可以允许用户关闭这个策略来提升体验。
不信任第三方系统原则
-
第三方的系统也可能会存在安全漏洞,进而被人攻击,应充分考虑到当第三方系统被攻击时,如何保障自己的业务系统的安全性。
-
如:当我们向第三方系统查询数据时,必须对数据进行有效性验证后才可以使用(比如使用这些数据进行数据库查询或显示到用户浏览器上)
公开设计原则
-
私有算法不公开不一定就是安全,因为有可能泄露,如抓包、反编译、入侵服务器等,如网易云异或加密。
-
正确地做法应该是:假设算法被破解或完全公开,同样能保证系统的安全。典型的案例诸如业界广泛使用的对称加密算法(AES)和非对称加密算法(RSA),它们的设计实现都是公开的,但是仍然是安全的。
数据与代码分离原则
-
数据与代码分离原则广泛适用于各种由于
"注入"
而引发的安全问题的场景。如XSS
、SQL Injection
、CRLF Injection
、X-Path Injection
等。
数据保护原则
数据分级原则
不同数据有不同的敏感程度和访问密级,如果对所有数据都采用高密级的保护,会影响实际运作的效率,同时也是对资源的浪费,因此需要建立一套数据的分级保护原则,针对不同级别的数据采用不同的保护措施。根据数据的敏感程度和访问密级,对数据密级划分为4个等级:
-
公开(不会产生任何影响)
-
公开信息,比如公钥、域名、连接等公开信息,这些信息通常不设置访问门槛。
-
-
敏感(易引起用户反感的数据)
-
联系方式信息:如手机号码、电话号码、电子邮箱、通讯地址。
-
证件号码:如身份证、驾驶证、护照号码。
-
建模后的生物性识别数据:如人脸数据、指纹数据。
-
位置与轨迹:如地理位置、出行记录、运动轨迹。
-
14周岁及以下儿童的相关信息。
-
-
秘密(一般的秘密信息,泄露会影响数据主体的利益)
-
密码密钥类:如登录密码、支付密码、密钥信息。
-
具有关联性质的个人原始信息,比如姓名+身份证号码+人脸共存。
-
-
机密(泄露会使数据主体的利益遭受严重的损害)
-
如用户的商绝密信息、商业机密、服务器私钥。
-
认证与鉴权
认证方式
-
基于知道的(口令认证):如账号密码认证;实现简单、使用简单、用户接受度最高、安全性最低。
-
基于拥有的(硬件认证、第三方认证):如智能卡、身份识别卡、SIM认证(短信)、邮箱认证;实现较简单、使用较简单、用户接受度较高、安全性较高。
-
基于固有的(生物信息认证):如指纹、人脸或虹膜;实现有一定难度、使用较简单、用户接受度较低、安全性高。
-
基于关系的():如指纹、人脸或虹膜;实现有一定难度、使用较简单、用户接受度较低、安全性高。
数据安全
网络安全
-
应采用密码安全技术或其他手段保证传输数据的完整性、保密性和抗抵赖。
-
传输认证类信息时,应采用安全技术措施处理后再进行传输,比如仅传输原数据的摘要。
-
公网环境使用安全的传输通信协议,如:HTTPS、TLS、DTLS等,尽量避免使用不安全的传输通信协议,比如FTP、SNMPv2。
-
禁止使用不安全的传输通信协议、加密方案。如需版本兼容,默认不兼容,充分告知用户使用不安全传输通信协议的风险,用户知晓并确认后开启。
存储安全
-
应采用密码安全技术或其他有效措施保证存储的数据的完整性、保密性和抗抵赖。
-
若需存储敏感信息的原始信息和处理后数据时,原始信息与处理后的数据分开存储。
-
采用密钥分级保护管理机制(如下图所示),至少实现2级保护机制。密钥部件至少由2部分构成,且至少有1部分在部署时随机生成。
-
禁止密钥硬编码写死在代码中。
UI去敏感化
-
展示层默认显示时脱敏后的敏感信息,以降低在展示环节的泄露风险,如手机号、银行卡号、身份证号码中间几位用
*
号代替。 -
输入密码等敏感信息时,需脱敏处理,如使用
*
号替代输入的信息,且禁止拷贝。 -
根据场景对用户数据去标识化处理,并与用户信息存储分离。
密码强弱规则
密码输入分为数字,小写字母,大写字母,特殊符号4类,等级分为4个等级,具体如下:
-
风险密码
-
密码长度小于8位,或者只包含4类字符中的任意一类,或者密码与用户名一样,或者密码是用户名的倒写。
-
-
弱密码
-
包含两类字符,且组合为(数字+小写字母)或(数字+大写字母),且长度大于等于8位。
-
-
中密码
-
包含两类字符,且组合不能为(数字+小写字母)和(数字+大写字母),且长度大于等于8位。
-
-
强密码
-
包含三类字符及以上,且长度大于等于8位。
-
function getPwdRank(username, userPassword) {
var iRank = 0;
userPassword.match(/[a-z]/g) && iRank++;
userPassword.match(/[A-Z]/g) && iRank++;
userPassword.match(/[0-9]/g) && iRank++;
userPassword.match(/[^a-zA-Z0-9]/g) && iRank++;
iRank = (iRank > 3 ? 3 : iRank);
if (userPassword.length < 8 || iRank === 1 || userPassword === username || userPassword === username.split("").reverse().join("")) {
iRank = 0;
}
if (iRank === 2) {
if ((userPassword.match(/[0-9]/g) && userPassword.match(/[a-z]/g)) || (userPassword.match(/[0-9]/g) && userPassword.match(/[A-Z]/g))) {
iRank = 1;
}
}
return iRank;
}
五类安全服务 [1]
认证(鉴别)服务:在网络交互过程中,对收发双方的身份及数据来源进行验证。 访问控制服务:防止未授权用户非法访问资源,包括用户身份认证和用户权限确认。 数据保密性服务:防止数据在传输过程中被破解、泄露。 数据完整性服务:防止数据在传输过程中被篡改。 抗否认性服务:也称为抗抵赖服务或确认服务。防止发送方与接收方双方在执行各自操作后,否认各自所做的操作。
OSI 八大安全机制 [2]
-
加密
-
常用的加密算法有对称加密算法(例如DES/AES/SM4等算法)和非对称加密算法(如RSA/ECC/SM2等算法)。
-
-
认证/数字签名
-
数字签名是认证(鉴别)服务最核心的技术。常用的签名算法有RSA算法、ECDSA算法、SM2算法等等
-
-
访问控制
-
通过用户角色、用户组等规则进行验证,一般的应用常使用基于用户角色的访问控制方式。
-
-
数据完整性
-
通常可以使用单向加密算法对数据加密,生成唯一验证码,用以校验数据完整性。常用的加密算法有MD5和SHA
-
-
业务流填充
-
在数据传输过程中传输随机数的方式,混淆真实的数据,加大数据破解的难度,提高数据的保密性。
-
-
网络隔离
-
避免使用不安全网络进行数据交互,如网关来隔离公网直接访问微服务。
-
-
公证
-
公证机制对应抗否认性服务。公证机制的作用在于解决收发双方的纠纷问题,确保两方利益不受损害。类似于显示生活中,合同双方签署合同的同时,需要将合同的第三份交由第三方公证机构进行公证。
-
加密算法选择
对称加密算法使用
-
常用算法:AES、SM4(类AES)
-
AES标准有一些要素:密钥、加密模式、向量、填充模式等。(标准本身是公开的)
关键点:位数足够(至少128位,推荐256位),保护密钥,针对不同特性的明文选用合适的加密模式。 |
模式选型说明
-
ECB
-
适用:分组少(字符长度小于32,两个分组以下),且数据本身随机性较好
-
避免:分组较多(>32个字符,>2个分组),部分格式固定
-
-
CBC
-
适用:分组一般(10个分组以下),第一个分组随机性较好
-
避免:分组较多(>10个分组),第一个分组格式固定
-
密码(口令)加解密
密码(口令)包括登录密码、中间件(数据库、消息队列、缓存服务)访问密码等,使用AES对称加密算法对密码(口令)加密存储和传输。
特点:长度在8~32字节,在AES中,最多2个分组,且密码本身具有随机性,因此可以使用ECB模式,更推荐使用CBC模式。
私钥证书加解密
服务实现https协议,需要私钥证书,私钥证书需要加密保存。
特点:私钥证书的格式是公开的,而且头尾带有固定标识,如PEM格式的私钥:
—–BEGIN RSA PRIVATE KEY—– MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx ... 1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU= —–END RSA PRIVATE KEY—–
在AES加密过程中会产生多个分组,考虑到证书文件中有明显的固定标识,因此禁止使用 ECB
模式对私钥证书加解密(已知明文攻击,破解密钥),推荐使用 GCM
模式。