架构笔记之安全
数字摘要
- 摘要算法
- MD5 / 128 bits / Message Digest Algorithm 5
- SHA / 160 bits / Secure Hash Algorithm
计算出的摘要(byte数组)转换成字符串之后可能会包含一些无法显示或网络传输的控制字符,因此需要对生成的摘要字符串进行编码。
- 编码算法
- 十六进制编码
- Base 64 编码(每 6 位为一个单元,2^6 = 64,因此称为 Base64)
- 彩虹表(Rainbow Table) 一张采用各种 Hash 算法生成的一串密文。 大型网站数据库的沦陷(用户名+明文密码)继续完善了彩虹表。
加密算法
- 对称加密算法
- DES 算法(Data Encryption Standard)
- AES 算法(Advanced Encryption Standard)
- 非对称加密算法 RSA 算法以发明者名字命名(Ron Rivest、Adi Shamirh & LenAdleman)。 数论原理:将两个大素数相乘十分容易,但反过来想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
数字签名
利用非对称加密对消息摘要(Message Digest)进行签名。
- MD5withRSA
- SHA1withRSA
数字证书(Digital Certificate)
类似身份证,一般采用 Base64 编码后再进行存储。
- 格式(X.509)
- 对象名称(人、服务器、组织)
- 证书过期时间
- 证书颁发机构(担保人)
- 证书颁发机构对证书信息的数字签名
- 数字签名算法
- 对象的公钥
- 签发机构 (CA、Certificate Authority)
- 证书管理
要获得数字证书,首先需要使用数字证书管理工具,如 keytool、OpenSSL 等,然后构建 CSR(Certificate Signing Request,数字证书签发申请),提交给数字证书认证机构进行签名,最终形成数字证书。
- keytool
- OpenSSL
摘要认证实现
- 客户端参数摘要生成
------------
请求参数
------------
|
\|/
------------
参数排序
------------
|
\|/
--------------------------------------
参数串接(加上 Secret)生成待摘要字符串
--------------------------------------
|
\|/
----------------------
生成摘要(MD5 or SHA)
----------------------
- 服务端参数摘要校验
------------
请求参数
------------
|
\|/
------------
参数排序
------------
|
\|/
--------------------------------------
参数串接(加上 Secret)生成待摘要字符串
--------------------------------------
|
\|/
--------------------------------------
生成摘要(MD5 or SHA)
--------------------------------------
|
\|/
---------------------------------------------------
服务端生成的摘要串与客户端通过header传递过来的摘要串进行比较
---------------------------------------------------
|
\|/
----------------------
生成摘要(MD5 or SHA)
----------------------
- 服务端响应摘要生成
------------
响应内容
------------
|
\|/
--------------------------------------
参数串接(加上 Secret)生成待摘要字符串
--------------------------------------
|
\|/
--------------------------------------
生成摘要(MD5 or SHA)
--------------------------------------
|
\|/
----------------------
响应摘要串
----------------------
- 客户端响应摘要校验
--------------
服务端响应内容
--------------
|
\|/
---------------------------------------------------
客户端接收到响应内容后,在后面加上secret,生成待摘要字符串
----------------------------------------------------
|
\|/
--------------------------------------
生成摘要(MD5 or SHA)
--------------------------------------
|
\|/
-----------------------------------------------------
客户端生成的摘要串与服务端通过header传递过来的摘要串进行比较
-----------------------------------------------------
|
\|/
----------------------
响应是否被篡改
----------------------
签名认证
摘要认证依赖于服务端与客户端共享的 secret,因此 secret 一旦泄露那么攻击者就可以很轻松的伪造请求,为了提高安全性还是要使用数字签名(MD5withRSA / SHA1withRSA),参数排序拼接生成摘要串后使用私钥进行加密。
认证(签名认证 or 数字认证)只解决了数据完整性和通信两端合法性的问题,并没有保证敏感数据的安全性,例如用户密码等。
HTTPS
- HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)依托 SSL 协议,确保整个通信过程都是经过加密的,密钥随机产生,通过数字证书(HTTPS 证书)进行身份认证。
- HTTPS 支持单向认证(只需要服务端提供证书)和双向认证(服务端和客户端都需要提供证书)。
HTTP(应用层)
----------------------------------
SSL or TLS(安全层)
----------------------------------
TCP(传输层)
----------------------------------
IP(网络层)
----------------------------------
网络接口层
- SSL(Secure Socket Layer)在协议栈中位于应用层之下,主要负责加密算法、通信密钥的协商以及两端的身份认证工作,并且独立于应用层协议(HTTP、SSH、FTP等等),对应用层是透明的,因此可以从 HTTP 无缝迁移到 HTTPS。
- TLS(Transport Layer Security)是 SSL 的升级版协议。
- SSL/TLS 位于 TCP 之上,又分为两层:
- Handshake Protocol(加密算法协商、通信密钥的交换、通信双方的身份认证)
- Record Protocol(数据封装、加密解密、数据压缩、数据校验)
---------------------------------- Handshake Protocol - - - - - - - - - - - - - - - - - - - Record Protocol ---------------------------------- TCP
客户端与服务端真实际上是通过对称加密进行数据交换,而加密密钥则是通过非对称加密进行协商的。
OAuth
核心思想是将资源做权限分级和隔离。
常见 Web 攻击手段
- XSS (Cross Site Scripting) 在HTML页面中嵌入恶意代码。XSS enables attackers to client-side scripts into web pages viewed by other users.
-
CSRF (Cross Site Request Forgery) 跨站请求伪造。XSS 利用的是站点内的信任用户,而 CSRF 则是通过伪装受信任用户的身份向第三方网站发送恶意请求。
防御手段
- 将 cookie 设置为
HttpOnly
(防止站内 XSS 漏洞盗取 cookie) - 增加 token(身份校验)
- 通过
referer
识别(HTTP 头有一个字段叫 referer)
- 将 cookie 设置为
- SQL 注入
举例,如果用户名为
zhangsan
,密码为' or '1'='1
,那么 SQL 语句可能会变成:select * from hhuser where nick = 'zhangsan' and passwords = '' or '1' = '1'
防御手段
- 使用预编译语句
- 使用 ORM 框架
-
文件上传漏洞 恶意攻击者利用一些网站没有对文件类型做很好的类型校验,上传了可执行的文件或脚本,并且通过脚本获得服务器上的相应权限,或者是通过有道外部用户访问、下载上传的病毒或者木马文件,打到攻击目的。
防御手段
- 文件类型白名单校验
- 利用魔数(magic number)而不是后缀名来获取文件类型
- DDos (Distributed Denial of Service)
- SYN Flood
利用 TCP 的三次握手,不响应服务端的
SYN+ACK
报文也就是不进行第三次握手。 - DNS Query Flood 向被攻击的服务器发送海量的域名解析请求。
- CC (Challenge Collapsar) 基于 HTTP 发起的 DDos 攻击,也称为 HTTP Flood。攻击者利用肉鸡或者匿名 HTTP 代理,模拟正常用户请求,避开 CDN 和分布式缓存进行多次 DB 查询操作或一次请求返回大量数据。
- SYN Flood
利用 TCP 的三次握手,不响应服务端的
- 其他攻击手段
- DNS 域名劫持
- CDN 回源攻击
- 服务器权限提升
- 缓冲区溢出
笔记来源:《大型分布式网站架构设计与实践》
留下评论