机密性(Confidentiality)、完整性(Integrity)、可用性(Availability),简
称为 CIA 三元组,是安全的基本原则。理论上来说,一个完整的安全保障体系,应该充分
考虑到所有的 CIA 原则。当然,实际情况中,我们会根据企业需求,对安全在这三个方向
上的投入做取舍。我们平时在评判一个企业的安全水平时,也会分别从这三个方向进行考
量。
黄金法则:在用户操作的各个环节中,我们所需要采取的安全策略。黄金法则的核
心内容包括三部分:认证、授权、审计。大部分情况下,事前防御属于认证,事中防御属于
授权,事后防御属于审计。
建议:对称加密用 AES-CTR、非对称加密用 ECC、散列算法用 SHA256。
发送方使用加密算法和密钥生成消息对应的密文;
接收方想要阅读消息,需要使用对应的解密算法和同样的密钥解密;
常见的经典对称加密算法有 DES、IDEA、AES、国密 SM1 和 SM4。
一般情况下,选取 AES128 进行加解密运算,就能获得较高的安全性和性能。
非对称加密中加密和解密使用不同的密钥。
发送方使用公钥对信息进行加密,接收方收到密文后,使用私钥进行解密。
常见的非对称加密算法:RSA(性能快,用的较多)、ECC 和国密 SM2
常见算法:MD5 、SHA 算法计算一个唯一的 id
除了提供唯一的 id,其更大的利用价值还在于它的不可逆性。当用户注册,提交账号密码时,作为一个安全的应用,通常使用散列算法存储密码。
对外认证通常是用户直接访问业务,是单一场景认证。外部的通常使用密码结合手机短信等认证
对内认证是指内部系统之间的访问,如git、mysql等。为了防止多系统带来的账号切换和安全性问题,通常使用sso单点登录解决身份认证问题
典型的单点登录方式:CAS (Central Authentication Service,集中式认证服务)流程、JWT、OAuth 和 OpenID。
CAS 是一个开源的单点登录框架,它不属于某一种单点登录的实现方式,而是提供了一整套完整的落地方案。
JWT(JSON Web Token)是一种非常轻量级的单点登录流程。它会在客户端保存一个凭证信息,之后在你每一次登录的请求中都带上这个凭证,将其作为登录状态的依据。JWT的好处在于,不需要应用服务端去额外维护 Cookie 或者 Session 了。但是,正是因为它将登录状态落到了客户端,所以我们无法进行注销等操作了。
OAuth(Open Authorization)的主要特点是授权,也是我们通常用 QQ、微信登录其他应用时所采用的协议。通过 OAuth,用户在完成了认证中心的登录之后,应用只能够验证用户确实在第三方登录了。但是,想要维持应用内的登录状态,应用还是得颁发自己的登录凭证。这也就是为什么 QQ 授权后,应用还需要绑定你的手机号码。这也就意味着,应用是基于 QQ 的信息创建了一个自身的账号。
OpenID(Open Identity Document)和 OAuth 的功能基本一致。但是,OpenID 不提供授权的功能。最常见的,当我们需要在应用中使用微信支付的时候,应用只需要收集支付相关的信息即可,并不需要获取用户的微信头像。
JWT 适用范围广,在单点登录的选取上面,如果想要将用户信息做统一管理,选择它最为简单;
如果认证中心只是被用来维护账号密码,由业务去维护用户所绑定的其他手机等信息,那么,采用 OAuth 更合适。
XSS工具的原理是诱导用户点击链接,执行js脚本,窃取用户信息,仿冒用户操作。
分类
反射型:浏览器–后端–浏览器
基于DOM:URL–浏览器
持久型:浏览器–后端–数据库–后端–浏览器
防护
CSP(Content Security Policy,内容安全策略)在服务端返回的 HTTP header 里面添加一个 Content-Security-Policy 选项,然后定义资源的白名单域名。浏览器就会识别这个字段,并限制对非白名单资源的访问。
通过构造一些恶意的输入参数,在应用拼接 SQL 语句的时候,去篡改正常的 SQL 语意,从而执行黑客所控制的 SQL 查询功能。
如下列sql
select * from users where username='' and password = ''
修改为
select * from users where username='' and password = '' or password = ''
则pasword字段为True,即可绕过密码登录
如下sql
insert into(username, password) values ('zzd', '111');
修改为
insert into users (username, password) values ('zzd', '111'); select * from users;
通过;号分割即可执行任意sql了
防护
使用ORM替代直接使用sql可以有效的防止此类问题