加密和安全

安全机制

1.1 信息安全防护的目标

  • 保密性
  • 完整性
  • 可用性
  • 可控性
  • 不可否认性

1.2 安全防护环节

  • 物理安全
  • 系统安全
  • 应用安全
  • 网络安全
  • 数据安全
  • 管理安全

1.3 常见的安全攻击STRIDE

  • 假冒 spoofing
  • 篡改 tampering
  • 否认 repudistion
  • 信息泄露 information disclosure
  • 拒绝服务 denial of service
  • 提升权限 elevation of privilege

1.4 安全设计基本原则

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

1.5 常用安全技术

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

1.6 加密算法和协议

1.6.1 对称加密

加密和解密使用同一个秘钥
| 常见算法:

  • DES:56bits
  • 3DES:Windows2000
  • AES:advanced(128,192,256bits)
  • blowfish,twofish
  • IDEA,RC6,CAST5

1.6.2 非对称加密算法

非对称加密:密钥是成对出现
公钥:公钥加密
私钥:解密

| 功能:

  • 数据加密:(a–>b发送数据)a拿b的公钥加密,b使用b的私钥解密
  • 数据来源确认:(a–>b,b确认数据来源)a用a的私钥加密,b使用a的公钥解密(签名)

| 常见算法:

  • RSA:
  • DSA:
  • ECC:

1.6.3 单向哈希算法

哈希算法:将任意数据压缩固定大小的摘要
特征:

  • 任意长度,固定输出
  • 数据修改,会产生雪崩效应
  • 不可逆

功能:保证数据的完整性

常见算法:MD5:128bits、sha1:160bits、sha224、sha256、sha384、sha512

常用工具:

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

RPM文件完整性:

rpm --verify package_name(or -V)
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
rpm --checksig package_file_name (or -K)

1.7 CA和证书

1.7.1 中间人攻击

man-in-the-middle。简称中间人

1.7.2 CA和证书

PKI:public key infrastructure 公共密钥加密体系
签证机构:CA (certificate authority)
注册机构:RA
证书吊销列表:CRL
证书存取库:
X.509:定义证书的结构以及认证协议标准

  • 版本号
  • 序列号
  • 签名算法
  • 颁发者
  • 有效期限
  • 主体名称

证书类型:

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

获取证书两种方式:

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

1.7.3 安全协议 SSL/TLS

1.7.3.1 TLS介绍

SSL:security socket layer 安全套接字层 TLS:transport layer security 传输层安全协议
功能:

  • 机密性
  • 认证
  • 完整性
  • 重放保护

1.7.3.2 SSL/TLS 组成

1.7.3.3 TLS 实现过程

实现分为握手阶段和应用阶段

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

1.7.4 HTTPS

HTTPS协议:是http协议和SSL/TLS协议的组合。对http协议的文本数据进行加密处理后,成为二进制形式传输。

1.7.4.1 HTTPS 结构

HTTP和SSL/TLS协议都属于应用层的协议(TCP/IP 协议四层)

1.7.4.2 HTTPS 工作简化过程

OpenSSL

1. OpenSSL介绍

openssl 时一套自有的加密工具,开放源代码的软件,应用程序可以使用这个软件进行安全通信,避免窃听,同时确认一端连线者的身份,以c语言写成,实现了基本的加密功能,实现了SSL和TLS协议。
包含的三个组件:

  • libcrypto:用于实现加密和解密的库
  • libssl:用于实现ssl通信协议的安全库
  • openssl:多用途命令行工具

2. base64编码

Base64 是一种基于64个可打印字符来表示二进制数据的方法。
base64的编码过程:
将所有字符转化为ASCII码,将ASCII码转化为8位二进制,将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;统一在6位二进制前补两个0凑足8位;将补0后的二进制转为十进制;从Base64编码表获取十进制对应的Base64编码;

  • 编码
echo -n Man | base64
  • 解码
echo TWFu |base64 -d

3. OpenSSL命令

两种运行模式:

  • 交互模式
  • 批处理模式

三种命令:

  • 标准命令
  • 消息摘要命令
  • 加密命令

3.1 openssl 命令对称加密

工具:openssl enc

# vim testfile
# 加密
# openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
# rm -rf testfile

# 解密
# openssl enc -d -des3 -a -salt -in testfile.cipher -out testfile
enter des-ede3-cbc decryption password:

3.2 openssl 命令单向哈希加密

工具:openssl dgst

# openssl md5 testfile
MD5(testfile)= 0eb5084481fdd6b1f762e728cf0616c7
# openssl sha512 testfile
SHA512(testfile)= c8bcfe2fb684b09a57c6367b631a766940c3d60e6d2d22b70a7520bafd1e1103e827d69b612b31888d8803aba898779048efc291db3cfe88fd0a017dac31d025
# sha512sum testfile
c8bcfe2fb684b09a57c6367b631a766940c3d60e6d2d22b70a7520bafd1e1103e827d69b612b31888d8803aba898779048efc291db3cfe88fd0a017dac31d025  testfile

3.3 openssl 命令生成用户密码

创建新用户同时指定密码,在 CentOS 和 Ubuntu 都通用

[root@centos8 ~]# getent shadow coleuser1
coleuser1:$6$XeFm4k9jwpPJTeXa$sBMNZSG1Z9a8PXov7m0fdhLXX8AFogCPs6nb0eRTYwRmVl5sTwf5op/zevlqVRInS.U2IkPVWaZYQKUEW4b4P/:18718:0:99999:7:::
[root@centos8 ~]# useradd -p `echo password | openssl passwd -6 -salt XeFm4k9jwpPJTeXa -stdin` coleuser2

[root@centos8 ~]# getent shadow coleuser1 coleuser2
coleuser1:$6$XeFm4k9jwpPJTeXa$sBMNZSG1Z9a8PXov7m0fdhLXX8AFogCPs6nb0eRTYwRmVl5sTwf5op/zevlqVRInS.U2IkPVWaZYQKUEW4b4P/:18718:0:99999:7:::
coleuser2:$6$XeFm4k9jwpPJTeXa$sBMNZSG1Z9a8PXov7m0fdhLXX8AFogCPs6nb0eRTYwRmVl5sTwf5op/zevlqVRInS.U2IkPVWaZYQKUEW4b4P/:18718:0:99999:7:::

3.4 openssl 命令生成随机数

# openssl rand -base64 9 |head -c10
HUap2bpMbt
# tr -dc '[:alnum:]' < /dev/urandom |head -c10
ZhQXzVZhks

3.5 openssl 命令实现 PKI

# 生成对称秘钥加密的私钥,通过设置严格的权限实现安全,应用更广泛
(umask 077; openssl genrsa -out app.key 2048)
cat /data/app.key

# 将加密对称秘钥key解密,此方式更安全,但是不方便
openssl genrsa -out app2.key -des3 2048

# 从私钥中提取出公钥
openssl rsa -in app.key -pubout -out app.key.pub

4. 建立私有CA实现证书申请颁发

证书申请及签署步骤: 1、生成证书申请请求;2、RA核验;3、CA签署;4、获取证书

OpenSSL 的配置文件:/etc/pki/tls/openssl.cnf

三种策略:match匹配、optional可选、supplied提供

match:要求申请填写的信息跟CA设置信息必须一致
optional:可有可无,跟CA设置信息可不一致
supplied:必须填写这项申请信息

1、创建私有CA

# 生成证书索引数据库文件
touch /etc/pki/CA/index.txt
# 指定第一个颁发证书的序列号
echo 01 > /etc/pki/CA/serial
# 生成CA私钥
cd /etc/pki/CA/
(umask 066; openssl genrsa -out private/cakey.pem 2048)
# 生成CA自签名证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
-new:生成新证书签署请求
-x509:专用于CA生成自签证书
-key:生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径

2、申请证书并颁发证书

# 为需要使用证书的主机生成生成私钥
(umask 066; openssl genrsa -out   /data/test.key 2048)
# 为需要使用证书的主机生成证书申请文件
openssl req -new -key /data/test.key -out /data/test.csr
# 在CA签署证书并将证书颁发给请求者
openssl ca -in /data/test.csr -out /etc/pki/CA/certs/test.crt -days 100
注意:默认要求 国家,省,公司名称三项必须和CA一致
# 查看证书中的信息
openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates
# 查看指定编号的证书状态
openssl ca -status SERIAL

3、吊销证书

# 在客户端获取要吊销的证书的serial
openssl x509 -in /etc/pki/CA/certs/test.crt   -noout   -serial  -subject
# 在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证书
openssl ca -revoke /etc/pki/CA/newcerts/<SERIAL>.pem
# 指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber
# 更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem
# 查看crl文件
openssl crl -in /etc/pki/CA/crl.pem -noout -text