加密和安全通信

安全通信

安全机制

对称加密算法

非对称加密算法

散列算法

base64编码机制

安全协议

OpenSSL

相关实验

安全机制

信息安全防护的目标

  • 保密性 Confidentiality
  • 完整性 Integrity
  • 可用性 Usability
  • 可控制性 Controlability
  • 不可否认性 Non-repudiation

安全防护环节

  • 物理安全:各种设备/主机、机房环境
  • 系统安全:主机或设备的操作系统
  • 应用安全:各种网络服务、应用程序
  • 网络安全:对网络访问的控制、防火墙规则
  • 数据安全:信息的备份与恢复、加密解密
  • 管理安全:各种保障性的规范、流程、方法

安全攻击: STRIDE

  • Spoofing 假冒
  • Tampering 篡改
  • Repudiation 否认
  • Information Disclosure 信息泄漏
  • Denial of Service 拒绝服务
  • Elevation of Privilege 提升权限

安全设计基本原则

  • 使用成熟的安全系统
  • 以小人之心度输入数据
  • 外部系统是不安全的
  • 最小授权
  • 减少外部接口
  • 缺省使用安全模式
  • 安全不是似是而非
  • 从STRIDE思考
  • 在入口处检查
  • 从管理上保护好你的系统

常用安全技术

  • 认证
  • 授权
  • 审计
  • 安全通信

加密算法和协议

  • 对称加密
  • 公钥加密
  • 单向加密
  • 认证协议

对称加密算法

对称加密:加密和解密使用同一个密钥

  • DES:Data Encryption Standard,56bits
  • 3DES:
  • AES:Advanced (128, 192, 256bits)
  • Blowfish,Twofish
  • IDEA,RC6,CAST5

对称加密的特性:

  • 1、加密、解密使用同一个密钥,效率高
  • 2、将原始数据分割成固定大小的块,逐个进行加密

对称加密的缺陷:

  • 1、密钥过多
  • 2、密钥分发
  • 3、数据来源无法确认

非对称加密算法

公钥加密:密钥是成对出现

  • 公钥:公开给所有人;public key
  • 私钥:自己留存,必须保证其私密性;secret key

非对称加密算法特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然

非对称加密算法功能:

  • 数字签名:主要在于让接收方确认发送方身份
  • 对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
  • 数据加密:适合加密较小数据

非对称加密算法缺点:密钥长,加密解密效率低下

非对称加密算法算法:

  • RSA(加密,数字签名)
  • DSA(数字签名)
  • ELGamal

基于一对公钥/密钥对

  • 用密钥对中的一个加密,另一个解密

实现加密:

  • 接收者
       生成公钥/密钥对:P和S
       公开公钥P,保密密钥S
  • 发送者
       使用接收者的公钥来加密消息M
       将P(M)发送给接收者
  • 接收者
       使用密钥S来解密:M=S(P(M))

实现数字签名:

  • 发送者
       生成公钥/密钥对:P和S
       公开公钥P,保密密钥S
       使用密钥S来加密消息M
       发送给接收者S(M)
  • 接收者
      使用发送者的公钥来解密M=P(S(M))

结合签名和加密

分离签名

单向散列(单向哈希)

将任意数据缩小成固定大小的“指纹”

  • 任意长度输入
  • 固定长度输出
  • 若修改数据,指纹也会改变(“不会产生冲突”)
  • 无法从指纹中重新生成数据(“单向”)

功能:数据完整性

常见算法

  • md5: 128bits、
  • sha1: 160bits、
  • sha224、
  • sha256、
  • sha384、
  • sha512、

常用工具

  • md5sum | sha1sum [ --check ] file
  • openssl、gpg
  • rpm -V

利用三种加密算法实现安全通信

对称加密:效率高、但无法确认数据来源

非对称加密:可以确定数据来源但效率低

数字签名

加密和安全通信_第1张图片

Alice == Bob
其中Alice的公钥PubA,私钥PriA
其中Bob的公钥PubB,私钥PriB

(data) --> PubB{PriA[hash(data)]+data} == data’ ==>to Bob
–> PriB(data’)–>PubA{PriA[hash(data)]+data}
–> hash(data) == hash(data)? :确认数据是否被篡改
–> 安全通信
但是:使用Bob公钥加密数据若太大,则解密时间消耗比较长

综合hash、对称、非对称三种通信:
(data) —> hash(data)
–> PriA[hash(data)] + key(data) + PubB(key) ==data’ ==>to Bob
–> PriB(PubB(key))==key 提取非对称加密数据的钥匙
–> PubA([hash(data)])==hash(data)提取data的digest 并验证data来源
–> key(key(data))==data 提取data
–> hash(data)=? hash(data) 确认data传输过程未被修改

秘钥交换

密钥交换:IKE( Internet Key Exchange )

方法一:公钥加密

方法二:DH (Deffie-Hellman):生成会话密钥
参看:https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange

gpg工具

使用gpg实现对称加密

  • gpg -c file 加密文件
  • gpg -o file -d file.gpg 解密文件 -o选项需在-d选项之前

使用gpg工具实现公钥加密

  • gpg --gen-key
  • gpg --list-keys
  • gpg -a --export -o XXX.pubkey
  • scp wang.pubkey hostB:
  • gpg -e -r XXX file file file.gpg

CA和证书

PKI:Public Key Infrastructure

  • 签证机构:CA(Certificate Authority)
  • 注册机构:RA
  • 证书吊销列表:CRL
  • 证书存取库:

X.509:定义了证书的结构以及认证协议标准

  • 版本号
  • 序列号
  • 签名算法
  • 颁发者
  • 有效期限
  • 主体名称
  • 主体公钥
  • CRL分发点
  • 扩展信息
  • 发行者签名

证书类型:

  • 证书授权机构的证书
  • 服务器
  • 用户证书

获取证书两种方法:

  • 使用证书授权机构
    生成证书请求(csr)
    将证书请求csr发送给CA
    CA签名颁发证书

  • 自签名的证书
    自已签发自己的公钥

安全协议

SSL:Secure Socket Layer,TLS: Transport Layer Security

  • 1995:SSL 2.0 Netscape
  • 1996:SSL 3.0
  • 1999:TLS 1.0
  • 2006:TLS 1.1 IETF(Internet工程任务组) RFC 4346
  • 2008:TLS 1.2 当前使用
  • 2015:TLS 1.3

功能:机密性,认证,完整性,重放保护

两阶段协议,分为握手阶段和应用阶段

  • 握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成
  • 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信

HTTPS结构

加密和安全通信_第2张图片

TLS(or SSL) 工作在应用层和传输层之间,对应用层数据进行加密。

OpenSSL

OpenSSL:开源项目

  • 三个组件:
    openssl:多用途的命令行工具,包openssl
    libcrypto:加密算法库,包openssl-libs
    libssl:加密模块应用库,实现了ssl及tls,包nss

openssl命令:

  • 两种运行模式:交互模式和批处理模式
  • openssl version:程序版本号
  • 标准命令、消息摘要命令、加密命令
  • 标准命令:enc, ca, req, …

openssl命令用法

对称加密:

  • 工具:openssl enc, gpg
  • 算法:3des, aes, blowfish, twofish
  • enc命令:
    帮助:man enc

单向加密:

  • 工具:md5sum, sha1sum, sha224sum,sha256sum…
    openssl dgst

  • dgst命令:
    帮助:man dgst

  • MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现
    网络通信中保证所传输数据的完整性机制

生成用户密码:

  • passwd命令:
    帮助:man sslpasswd

生成随机数:

  • 帮助:man sslrand
  • openssl rand -base64|-hex NUM
  • NUM: 表示字节数,使用-hex,每个字符为十六进制,相当于4位二进制,
    出现的字符数为NUM*2

公钥加密:

  • 算法:RSA, ELGamal
  • 工具:gpg, openssl rsautl(man rsautl)

数字签名:

  • 算法:RSA, DSA, ELGamal

密钥交换:

  • 算法:dh
  • DSA:Digital Signature Algorithm
  • DSS:Digital Signature Standard
  • RSA:

生成密钥对儿:man genrsa

  • 生成私钥
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS

    (umask 077; openssl genrsa –out test.key –des 2048)

openssl rsa -in test.key –out test2.key 将加密key解密
  • 从私钥中提取出公钥
openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE

openssl rsa –in test.key –pubout –out test.key.pub

随机数生成器:伪随机数字

  • 键盘和鼠标,块设备中断
  • /dev/random:仅从熵池返回随机数;随机数用尽,阻塞
  • /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机
    数,非阻塞

相关实验

base64编码机制

base64编码:[ 字母 | 数组 | + | / ]
加密和安全通信_第3张图片
因为ASCII码128中具有不可见字符,使用文本工具打开将乱码,base64编码字符 可见,因此base64可以将二进制文件用可见字符表示。

一个字节: 8bit
ASCII     8bit  
base64    6bit
base64编码编码与ascii编码转换:<>
    以ab、abc为例
    ~]# echo -n ab|base64
    YWI=

    a ascii 97  
    b=98
    c=99
ascii    01100001 01100010
base64   011000 | 01 0110 | 001000 <不够6位末尾添0补足>
         Y      | W       | I     =表示有用0补位
        
    ~]# echo -n abc|base64
    YWJj
ascii    01100001 01100010 01100011
base64   011000 | 01 0110 | 001001 | 100011 
         Y      | w       | J      | j

因此输出要为完整的base64编码时,24的倍数字节即为3的倍数

使用openssl生成随机数作口令:
    ~]# openssl rand -base64 9<此处9表示9字节 72 bite >
    6ptxyuxOKs6L <因此对应base64位12字符>

    生成8位随机数做密码
    ~]# openssl rand -base64 6
    6qTJ19ag

使用随机数8个字符串口令:
    ~]# cat /dev/urandom | tr -dc '[[:alnum:]]' |head -c 8
    ~]# openssl rand -base64 6

创建私有CA

创建私有CA必须满足以下条件:

  • 关闭selinux
  • 关闭iptables
  • 时间同步<涉及加密时间至关重要>

创建私有CA:

  • OpenSSL的配置文件:/etc/pki/tls/openssl.cof
  • 三种策略:match匹配、option可选、supplied提供
       match:要求申请填写的信息与CA设置信息必须一致
       optional:可有可无,跟CA设置信息可不一致
       supplied:必须填写这项申请信息
openssl配置文件/etc/pki/tls/openssl.cof详解:
#######################
[ ca ]  一台主机可以搭建多个CA,此处设置的是默认CA
default_ca  = CA_default  
#######################

[ CA_default ]  定义默认CA的相关信息

dir     = /etc/pki/CA  <默认CA相关数据的存放路径>     
certs       = $dir/certs       
crl_dir     = $dir/crl     
database    = $dir/index.txt  <颁发的证书的索引数据库>
    默认index.txt在/etc/pki/CA目录下不存在,需要手动创建
new_certs_dir   = $dir/newcerts  <新证书存放路径>
certificate = $dir/cacert.pem <根CA证书自签证明>
serial      = $dir/serial <当前序列号><颁发的证书有序列号>
    <当前编号表示下一个颁发的证书的编号><刚开始需要手动创建并指明初始编号>
crlnumber   = $dir/crlnumber  <证书吊销列表的编号>
crl     = $dir/crl.pem <证书吊销列表存放路径>
private_key = $dir/private/cakey.pem  <私钥存放路径>
...
#######################
##没有特别指定时的默认设置项
default_days    = 365 <颁发证书的默认有效期>           
default_crl_days= 30  <吊销列表有效期>    
default_md  = sha256        
preserve    = no  

#######################
# 需要遵守的策略  match,optional,supplied
policy      = policy_match
# For the CA policy
[ policy_match ] <搭建CA需要提供的相关信息>
countryName     = match
stateOrProvinceName = match
organizationName    = match
organizationalUnitName  = optional
commonName      = supplied
emailAddress        = optional
....

[ policy_anything ] <另一个策略>

证书申请及签署步骤

  • 1、生成申请请求
  • 2、RA核验
  • 3、CA签署
  • 4、获取证书

创建私有CA:

  • 1、创建所需要的文件
  • 2、CA自签证书
  • 3、颁发证书
  • 4、吊销证书

生成自签证书的相关选项:

  • -new:生成新证书签署请求
  • -x509:专用于CA生成自签证书
  • -key:生成请求时用到的私钥文件
  • -days n:证书的有戏期限
  • -out /PATH/TO/SOMECERTFILE:证书的保存路径
私有CA使用场景:企业内部使用与安全通信相关时,需要搭建私有CA;eg:https
===============================================
创建私有CA<创建CA主机>:

    ~]# cd /etc/pki/CA/  <先进入/etc/pki/CA/此目录>
①CA的私钥文件:/etc/pki/CA/private/cakey.pem
    CA]#(umask 066; openssl genrsa -out private/cakey.pem -des 2048 ) 
     -des <使用对称加密设置密码,防止私钥被盗用>
②生成自签名证书
    CA]# openssl req -new -x509 -key private/cakey.pem -days 3650 -out cacert.pem
        填写相关信息:
            :CN         <国家>
            :BJ         <省份>
            :BJ         <城市>
            :xixi.com   <组织/公司>
            :ops        <部门>
            :ca.xixi.com<网站的哪个主机>
注意:创建CA时并没创建/etc/pki/CA/index.txt和/etc/pki/CA/serial文件
因此CA此时直接给其他主机颁发证书会报错。

③创建/etc/pki/CA/index.txt 颁发证书的索引文件
     CA]# touch index.txt
④创建/etc/pki/CA/serial 颁发证书的当前序号 (两个数字表示16进制)
    CA]# echo 0F > serial

至此私有CA创建完成,可以给其他主机颁发证书。

++++++++++++++++++++++++++++++++++++++++++++++++
当有主机向CA主机发来证书申请请求时:

一、同意证书申请:
1)CA主机向请求证书颁发证书:颁发证书存放路径:/etc/pki/CA/certs/file.crt
    CA]# openssl ca -in app.csr -out certs/app.crt -days 100

此时:/etc/pki/CA/index.txt和/etc/pki/CA/serial 默认会添加记录
对应我此处使用的记录:
    CA]# cat index.txt
    V	191208123005Z	 0F unknown	/C=CN/ST=BJ/O=xixi.com/OU=ops/CN=app.xixi.com
    CA]# cat serial
    10   则下一个颁发的证书编号为10,16进制数字

── certs
│   └── app.crt
├── newcerts  <自动生成app.crt的拷贝文件放置于newcerts目录>
│   └── 0F.pem 

2)将颁发的证书传给请求主机
    CA]# scp certs/app.crt [email protected]:/data/app

================================================

此时另一主机某服务使用加密时向CA申请证书:

①新建文件夹:/data/app --> 此处仅参考使用<对应于某一服务目录下的配置文件>
    ~]# mkdir /data/app; cd /data/app<进入新建目录>
②生成对应服务的私钥文件  
    app]# (umask 077; openssl genrsa -out app.key 1024)
③生成证书申请文件<此文件为证书申请文件文件后缀一般为:filename.csr>
    app]# openssl req -new -key app.key -out app.csr
        填写相关信息:
                    :CN         <国家>
                    :BJ         <省份>
                    :BJ         <城市>
                    :xixi.com   <组织/公司>
                    :ops        <部门>
                    :app.xixi.com<网站的哪个主机>
    <因为采取的默认policy_match策略需要保持三项相同>
        countryName     = match     <国家>
        stateOrProvinceName = match <省份>
        organizationName    = match <组织/公司>
④将证书申请文件传给CA主机、等待CA主机颁发证书
    app]# scp app.csr [email protected]:/etc/pki/CA/


##############################################
# 创建CA主机的脚本?
# CA主机给服务主机颁发证书脚本?
# 合并两个脚本至同一脚本中

你可能感兴趣的:(安全相关)