架构笔记之安全

Posted by liangfei on 2017-02-01

数字摘要

  • 摘要算法
    • 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)
    1. 对象名称(人、服务器、组织)
    2. 证书过期时间
    3. 证书颁发机构(担保人)
    4. 证书颁发机构对证书信息的数字签名
    5. 数字签名算法
    6. 对象的公钥
  • 签发机构 (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

核心思想是将资源做权限分级和隔离

OAuth 2.0

常见 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 则是通过伪装受信任用户的身份向第三方网站发送恶意请求。

    防御手段

    1. 将 cookie 设置为 HttpOnly防止站内 XSS 漏洞盗取 cookie
    2. 增加 token(身份校验
    3. 通过 referer 识别(HTTP 头有一个字段叫 referer
  • SQL 注入
    举例,如果用户名为 zhangsan,密码为 ' or '1'='1,那么 SQL 语句可能会变成:

    select * from hhuser where nick = 'zhangsan' and passwords = '' or '1' = '1'

    防御手段

    1. 使用预编译语句
    2. 使用 ORM 框架
  • 文件上传漏洞
    恶意攻击者利用一些网站没有对文件类型做很好的类型校验,上传了可执行的文件或脚本,并且通过脚本获得服务器上的相应权限,或者是通过有道外部用户访问、下载上传的病毒或者木马文件,打到攻击目的。

    防御手段

    1. 文件类型白名单校验
    2. 利用魔数(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 查询操作或一次请求返回大量数据。
  • 其他攻击手段

    • DNS 域名劫持
    • CDN 回源攻击
    • 服务器权限提升
    • 缓冲区溢出

笔记来源:《大型分布式网站架构设计与实践》


欢迎扫码关注 老梁写代码 微信公众号