通信安全 (1).png

1 概述

为解决两台主机之间的数据传输的通信安全,我们必须遵循以下三个安全目标

  • 保密性:数据是被加密的,就算被第三方截获也无法查看原始数据
  • 完整性:数据到达目标时是完整的,没有被破坏的
  • 可用性:信息是可用的

针对以上三个安全目标对应的攻击类型有:

  • 威胁保密性的攻击:窃听、通信量分析
  • 威胁完整性的攻击:更改、伪装、重放
  • 威胁可用性的攻击:拒绝服务(Dos)

针对以上攻击类型的解决方案有:
技术:加密和解密以及服务(用于抵御攻击的服务,也即是为了上述安全目标而特地涉及的安全服务)

  • 传统加密方法:替代加密算法,置换加密算法
  • 现代加密方案:现代块加密方法
  • 服务:认证机制、访问控制机制

    2 加密、解密

    密钥算法和协议:对称加密、非对称加密、单项加密、认证协议
    Linux系统下的加解密工具:OpenSSL(ssl),GPG(pgp)
    OpenSSl由三部分组成:

  • libencrypt库

  • libssl库
  • openssl多用途命令行工具

    2.1 加密算法和协议

    2.1.1 对称加密

    加密和解密使用的是同一个密钥;数据加密(保密性)
    DES: Data Encryption Standard,该加密方式已经寿终正寝了
    3DES:Triple DES ;
    AES: Advanced Encryption Standard;(128bits,192bits,256bits,384bits)
    Blowfish
    Twofish
    IDEA
    RC6
    CASTS
    特性:
    1、加密、解密使用同一个密钥
    2、将原始数据分割成为固定大小的块,逐个进行加密
    缺陷:
    1、密钥过多;
    2、密钥分发困难;

    2.1.2 公钥加密

    密钥分为公钥与私钥,
    公钥:从私钥中提取产生,可公开给所有人,pubkey
    私钥:通过工具创建,使用者自己留存,必须保证其私密性,secret key
    特点:用公钥加密的数据,只能使用与之配对的私钥解密,反之亦然;
    用途:
    数字签名(身份认证):主要用户让接收方确认发送方的身份
    密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方
    数据加密:不常用,因为此种方式加密效率太低,比对称加密要慢3个数量级
    基于非对称密钥的通信过程:模拟A给B发送数据
    1、A首先对原始数据进行单向加密,比如常见的MD5算法,定长输出一个数据特征码
    2、A利用自己的私钥对特征码进行加密,并附加在数据后面
    3、A生成一个临时的对称密钥,对以上的整个数据进行加密
    4、A利用B的公钥加密第3步的对称密钥,附加在数据后面并将以上所有数据发送给B
    其实以上有一个最大的漏洞,就是A怎么确认拿到B的公钥就一定是B的,会不会有人冒充B呢,此时就引入了CA
    算法:RSA、DSA、ELGamal

    2.1.3 单向加密

    即提出数据指纹,只能加密,不能解密
    特性:定长输出、雪崩效应
    功能:校验数据的完整性
    算法:
    md5:Message Digest 5,128bits
    sha1:Secure Hash Algorithm 1, 160bits,除此之外sha还有sha224,sha256,sha384, sha512

    2.1.4 密钥交换

    IKE(Internet Key Exchange)
    1、公钥加密,通过公钥来加密对称密钥,并发送给对方
    2、DH(Deffie-Hellman)
    下面对DH算法做个简单的说明:A、B分别为两个用户;p,g为他们协商生成的随机数
    A:p,g
    B:p,g
    A:x
    —>p^x%g ==>B
    A: (p^y%g)^x
    B:y
    —>p^y%g ==>A
    B: (p^x%g)^y
    其它IKE算法:RSA,DH(迪菲-赫尔曼),ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)

    2.2 PKI

    公钥基础设施:Public Key Infrastructure,分为以下四个部分组成
  1. 签证机构:CA
  2. 注册机构:RA
  3. 证书吊销列表:CRL
  4. 证书存取库:

    2.3 X.509

    目前共有三个版本,v1, v2, v3:定义了证书的结构和认证的协议标准,以下定义了一个ca签署的证书需要包含了哪些字段属性:
    版本号
    序列号
    签名算法ID
    发行者的名称
    有效期限
    主题名称
    主体公钥
    发行者的唯一标识
    主体的唯一标识
    扩展
    发行者的签名

    2.4 SSL/TLS

    SSL:Secure socker Layer
    Netscape: 1994
    v1.0,v2.0,v3.0, 因漏洞情况,在加上是商业的原因,几乎被废弃使用
    TLS:Transport Layer Security
    IETF:1999
    v1.0,v1.1,v1.2,v1.3,几乎已经成为现在实际使用的事实标准
    分层设计:
    1、最底层:基础算法语言实现,aes,rsa,md5
    2、向上一层:各种算法的实现
    3、再向上一层:组合算法实现半成品
    4、用各种组件拼装而成的各种成品密码学协议软件
    协议的开源实现:OpenSSL
    SSL会话主要的三个步骤
    客户端向服务器端索要并验证证书;
    双方协商生成“会话密钥”
    双方采用“会话密钥”进行加密通信
    SSL Handshake Protocol
    第一阶段:ClientHello:
    支持的协议版本,比如TLS 1.2;
    客户端生成的一个随机数,稍后用户生成“会话密钥”
    支持的加密算法,比如AES,RSA
    支持的压缩算法
    第二阶段:ServerHello
    确认使用的加密通信协议版本,比如TLS 1.2;
    服务器端生成一个随机数,稍后用于生成“会话密钥”
    确认使用的加密方法
    服务器证书;
    第三阶段:
    验证服务器证书,确认无误后取出其公钥; (证机构, 证书完整性, 证书持有者,证书有效期, 吊销列表)
    发送以下信息给服务器端:
    一个随机数
    编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送
    客户端握手结束通知
    第四阶段:
    收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所用到的“会话密钥”
    服务端握手结束通知

    3 OpenSSL

    3.1 组件:

    1、libcrypto,libssl主要由开发者使用;2、openssl:多用途命令行工具;
    Openssl:有多个子命令,分为三类:
    标准命令
    消息摘要命令(dgst子命令)
    加密命令(enc子命令)
    标准命令:enc,ca,req,genrsa,…

    3.2 对称加密

    工具:openssl enc,gpg
    支持的算法:3des,aes,blowfish,towfish
    enc命令:
    加密:]# openssl enc -e -des3 -a -salt -in ./fstab -out ./fstab.ciphertext
    解密:]# openssl enc -d -des3 -a -salt -out ./fstab -in ./fstab.ciphertext

    3.3 单向加密

    工具:openssl dgst,md5sum,sha1sum,sha224sum,…
    dgst命令:
    ~]# openssl dgst -md5 /PATH/TO/SOMEFILE

    3.4 生成用户密码

    工具:passwd,openssl passwd
    ]# openssl passwd -1 -salt SALT

    3.5 生成随机数

    工具:openssl rand
    ]# openssl rand -hex NUM
    ]# openssl rand -base64 NUM

    3.6 公钥加密

    加密解密
    算法:RSA,ELGamal
    工具:openssl rsautl,gpg
    数字签名
    算法:RSA,DSA,ELGamal
    工具:openssl rsautl,gpg
    密钥交换
    算法:DH
    生成密钥对
    生成私钥:]# (umask 077; openssl genrsa -out /tmp/myprivate.key 2048)
    提出公钥:]# openssl rsa -in /tmp/myprivate.key -pubout

    4 Linux系统上的随机数生成器

    /dev/random:仅从熵池返回随机数,随机数用尽,阻塞;
    /dev/urandom:从熵池返回随机数,随机数用尽,会利用软件生成伪随机数,非阻塞;
    伪随机数不安全;
    熵池中随机数的来源:

    • 硬盘IO中断时间间隔;
    • 键盘IO中断时间间隔;

      5 CA

      CA可分为两种:公共信任的CA,私有CA
      建立私有CA的工具:openssl、OpenCA
      配置文件:/etc/pki/tls/openssl.cnf

      5.1 构建私有CA

      在确认配置为CA服务器上生成一个自签名证书,并为CA提供所需的目录及文件即可;
      1)生成私钥:
      ]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
      2)生成自签名证书:
      ]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
      -new:生成新证书签署请求
      -x509:生成自签格式证书,专用于创建私有CA时;
      -key:生成请求时用到的私有文件路径(从私钥文件中提取公钥)
      -out:生成的请求文件路径,如果自签操作将直接生成签署过的证书
      -days:证书的有效时常,单位时day;
      3)为CA提供所需的目录及文件
      ]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
      ]# touch /etc/pki/CA/{serial,index.txt}
      ]# echo 01 >/etc/pki/CA/serial

      5.3 签署证书

      要用到证书进行安全通信的服务器,需要向CA请求签署证书:
      步骤:(以http为例)
      1)用到证书的主机生成私钥
      ]# mkdir /etc/httpd/ssl && cd /etc/httpd/ssl
      ]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
      2)生成证书签署请求
      ]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 3650
      3)将签署请求通过可靠方式发送给CA主机
      4)在CA主机上签署证书
      ]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 3650
      查看证书中的信息
      ]# openssl x509 -in /etc/pki/CA/certshttpd.crt -noout -serial -subject

      5.4 吊销证书

      1)客户端获取要吊销的证书的serial(在使用证书的主机执行)
      ]# openssl x509 - in /etc/pki/CA/certshttpd.crt -noout -serial -subject
      2)CA主机吊销证书
      先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致
      吊销:
      ]# openssl ca -revoke /etc/pki/CA/netcerts/SERIAL.pem
      其中的SERIAL要换成证书真正的序列号
      3)生成吊销证书的吊销编号(第一次吊销证书时才执行)
      ]# echo 01 >/etc/pki/CA/crlnumber
      4)更新证书吊销列表
      ]# openssl ca -gencrl -out thisca.crl
      查看crl文件:
      ]# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text