加密和安全

安全机制
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