架构笔记之安全

数字摘要

  • 摘要算法
    • 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 回源攻击
    • 服务器权限提升
    • 缓冲区溢出

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

更新时间:

留下评论