Linux 加密解密技术基础

  • 基础概念
    • 信息安全防护的目标
    • 安全防护环节
    • 安全攻击类型(STRIDE)
    • 安全设计的基本原则
    • 常用的安全技术
  • 安全的解决方案
    • 1.加密和解密
    • 2.服务
    • 3.密钥算法和协议
  • 密钥算法和协议介绍
    • 1.对称加密算法
    • 2.公钥加密(非对称加密)算法
      • 数字签名
    • 3.单向加密
    • 4.密钥交换
  • OpenSSL
    • 1、协议简介
    • 2、协议阶段
    • 3、协议设计
    • 4、开源实现
    • 5、协议模型
    • 6、SSL/TLS 会话
      • 为什么要生成三个随机数呢?
    • 7、双向证书认证的SSL过程
    • 8、OpenSSL 命令
      • 8.1 对称加密
      • 8.2 单向加密
      • 8.3 生成用户密码
      • 8.4 生成随机数
      • 8.5 公钥加密
      • 8.6 Linux系统上的随机数生成器

基础概念

信息安全防护的目标

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

安全防护环节

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

安全攻击类型(STRIDE)

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

还可分为以下几类:

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

安全设计的基本原则

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

常用的安全技术

认证
授权
审计
安全通信

安全的解决方案

运用相关技术对数据进行加密和解密,增加相关服务,此服务是用于抵御攻击的服务,也是为了上述安全目标而特地设计的安全服务。

1.加密和解密

  1. 传统加密方法:替代加密方法、置换加密方法
  2. 现代加密方法:现代块加密方法

2.服务

  1. 提供认证机制
  2. 访问控制机制

3.密钥算法和协议

  1. 对称加密
  2. 公钥加密
  3. 单向加密
  4. 认证协议

密钥算法和协议介绍

1.对称加密算法

1、对称加密:# 加密和解密使用同一个密钥2、常用算法:# DES:Data Encryption Standard# 3DES:Triple DES# AES:Advanced Encryption Standard# Blowfish# Twofish# IDEA# RC6# CAST53、特性:# 加密和解密使用同一个密钥# 将原始数据分隔为固定大小的块,逐个进行加密4、缺陷:# 密钥过多(不同用户密钥不同,不同块密钥也不同)# 密钥分发困难# 数据来源无法确认

2.公钥加密(非对称加密)算法

1、非对称加密:# 公钥:公开给所有人,public key# 私钥:自己留存,必须保证其私密性,se'cret key2、特点:# 用公钥加密数据,只能使用与之配对的私钥解密# 用私钥加密数据,只能使用与之配对的公钥解密3、功能:# 数字签名:主要在于让接收方确认发送方身份# 密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方# 数据加密:很少使用,因为加密效率比较低下4、缺陷:# 密钥长,加密效率低下5、加密算法:# RSA:既能实现签名,又能加解密数据# DSA:只能实现签名,没有加解密功能# ELGamal
  • RSA:公钥加密算法是1977年由Ron Rivest、 Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的,RSA取名来自开发他们三者的名字,后成立RSA数据安全有限公司。 RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。 RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
  • DSA (Digital Signature Algorithm):1991年7月26日提交,并归属于David W. Kravitz前NSA员工,DSA是Schnorr和ElGamal签名算法的变种,被美国NIST作为SS(DigitalSignature Standard), DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。 DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多

数字签名

可参考下图来理解数字签名。
1、加密过程

用单向加密计算出数据的特征码
把特征码用自己的私钥进行加密后,附加在要发送数据后面 (就是数字签名)
生成一个临时的对称密钥,来加密整段数据(包括数字签名)
获取到对方的公钥,把刚才生成的临时的对称密钥进行加密后,附加在数据后面

2、解密过程

先用自己的私钥解密出对称密钥
用对称密钥解密数据内容(数据 + 数字签名)
用对方的公钥解密数据特征码,进行身份认证
用单向加密计算数据的特征码与之进行进行比较,验证数据的完整性

3.单向加密

1、单向加密:# 提取数据指纹(数据特征码)# 只能加密,不能解密# 单向使用,即无法使用特征码恢复为数据2、特性:# 定长输出(任意长度输入,固定长度输出)# 雪崩效应(初始数据的微小改变将改变加密数据结果的巨大变化)3、功能:# 验证数据完整性4、常见算法:# md5(Message Digest 5): 128bits# sha1(Secure Hash Algorithm 1): 160bits# sha224、 sha256、 sha384、 sha512

4.密钥交换

密钥交换:IKE( Internet Key Exchange )
# 公钥加密
# DH (Deffie-Hellman):生成会话密钥DH算法:
#1A: g,p 协商生成公开的整数g, 大素数pB: g,p 协商生成公开的整数g, 大素数p
#2A:生成隐私数据 :a (a<p ),计算得出 g^a%p,发送给BB:生成隐私数据 :b,计算得出 g^b%p,发送给A
#3A:计算得出 [(g^b%p)^a] %p = g^ab%p,生成为密钥B:计算得出 [(g^a%p)^b] %p = g^ab%p,生成为密钥

OpenSSL

两个主机间的通信就是两个进程之间的通信。不同主机的进程间通信运用了socket技术,就是IP地址+端口号。
在CS模式中,服务器端口会一直处于监听状态(LISTEN),等待客户端来进行连接。

Sockets:C/S:Client:发起应用请求的程序Server:响应请求(提供服务)的程序LISTEN: Socket

常用的安全协议有 SSL 和 TLS。

1、协议简介

SSL:Secure Socket Layer
TLS:Transport Layer Security1995:SSL 2.0 Netscape1996:SSL 3.01999:TLS 1.02006:TLS 1.1 IETF(Internet工程任务组) RFC 43462008:TLS 1.2 当前主流使用2015:TLS 1.3
功能:机密性,认证,完整性,重放保护

2、协议阶段

协议主要分为两段:握手阶段和应用阶段。

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

3、协议设计

协议是基于分层设计的,主要分为以下基层:

# 最底层:基础算法原语的实现,aes, rsa, md5
# 向上一层:各种算法的实现;
# 再向上一层:组合算法实现的半成品;
# 用各种组件拼装而成的各种成品密码学协议软件;

4、开源实现

OpenSSL主要由三部分组成。

  1. libencrypto库:用于实现加密解密的库。
  2. libssl库:用于实现ssl功能的库。
  3. openssl多用途命令行工具:用于实现ssl功能,实现加密解密的功能。

该协议是由开源组织维护的。其中libcrypto, libssl主要由开发者使用,openssl:多用途命令行工具。

5、协议模型

  1. Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
  2. ChangeCipherSpec 协议:一条消息表明握手协议已经完成
  3. Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
  4. Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
  5. HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输

6、SSL/TLS 会话

SSL会话主要分为三步:

  1. 客户端向服务器端索要并验正证书
  2. 双方协商生成“会话密钥”
  3. 双方采用“会话密钥”进行加密通信

SSL Handshake Protocol 流程如下:

第一阶段:ClientHello:支持的协议版本,比如tls 1.2客户端生成一个随机数,稍后用户生成“会话密钥”支持的加密算法,比如AES、3DES、RSA支持的压缩算法
第二阶段:ServerHello确认使用的加密通信协议版本,比如tls 1.2服务器端生成一个随机数,稍后用于生成“会话密钥”确认使用的加密方法服务器证书
第三阶段:验正服务器证书,在确认无误后取出其公钥#(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)               发送以下信息给服务器端:一个随机数编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送客户端握手结束通知
第四阶段:收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”向客户端发送如下信息:编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送服务端握手结束通知# 避免随机数有迹可循,反复发送,进行再次“随机”

为什么要生成三个随机数呢?

  • 不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
  • 对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
  • pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。

7、双向证书认证的SSL过程

以CS模型来进行解释,服务器由证书,客户端一般没有证书(特殊情况除外)。
通信过程:

A 服务器  <-------->  B 客户端
  1. 双方交换公钥
  2. 加密算法使用何种算法
  3. 双方拿到对方的证书以后,要进行证书认证(证书里面有公钥)
对证书进行验证3.1 要用CA的公钥去解密CA的签名,能解密说明证书来源可靠3.2 用相同的加密算法去加密证书,获取特征码,与解密的特征码进行比较,一致说明证书完整性可靠3.3 检查证书的有效期限3.4 验证主体名称和自己的通信对方是否对应3.5 检查证书是否被吊销客户端一定要验证服务器端服务器端不一定要验证客户端证书特殊情况:需要验证,如访问网银页面的时候,需要验证客户端  为什么银行给的网银证书基本不收钱呢?因为那是银行搭建的私有CA办法的证书。
  1. 加密过程
用单向加密计算出数据的特征码
把特征码用自己的私钥进行加密后,附加在要发送数据后面
生成一个临时的对称密钥,来加密整段数据
获取到对方的公钥,把刚才生成的临时的对称密钥进行加密后,附加在数据后面
  1. 解密过程
先用自己的私钥解密对称密钥
用对称密钥解密数据内容
用对方的公钥解密数据特征码,进行身份认证
用单向机密计算数据的特征码与之进行进行比较,验证数据的完整性建立会话之前,会发送hello报文终止会话之前,也会发送相关报文访问的网址和证书主体不一致的时候,也会提示没有证书的话,会提示访问页面有风险

8、OpenSSL 命令

有众多子命令,分为三类:

标准命令(enc, ca, req, genrsa, ...)
消息摘要命令(dgst子命令)
加密命令(enc子命令)
openssl命令配置文件:/etc/pki/tls/openssl.cnf

8.1 对称加密

工具: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
[root@LeeMumu ~]# cat 1.txt
This is a new text![root@LeeMumu ~]# openssl enc -e -des3 -a -salt -in 1.txt -out 1.ciphertext
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:[root@LeeMumu ~]# cat 1.ciphertext
U2FsdGVkX1+gQCEBjQDn/kYflV9MhnPO0PUaAN3x+d4QCMtmtwYbKw==[root@LeeMumu ~]# openssl enc -e -des3 -a -salt -in 1.txt -out 1.ciphertext.2
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:[root@LeeMumu ~]# cat 1.ciphertext.2                # 相同的文件因加的salt不一样,所以加密结果是不一致的
U2FsdGVkX1+yft9/7FQf/AZibd/WWk5Bk/yeIrNss2yqiSr1W1ms+w==
[root@LeeMumu ~]# rm 1.txt
rm: remove regular file ‘1.txt’? y[root@LeeMumu ~]# openssl  enc  -d  -des3  -a  -salt  -out 1.txt   -in 1.ciphertext
enter des-ede3-cbc decryption password:[root@LeeMumu ~]# cat 1.txt                          # 解密成功
This is a new text!

8.2 单向加密

工具:openssl dgst, md5sum, sha1sum, sha224sum, ...
dgst命令:# openssl  dgst  -md5  /PATH/TO/SOMEFILE
[root@LeeMumu ~]# openssl dgst -md5 1.txt
MD5(1.txt)= 28ef800345e8d6c508aa3520484e86c8

8.3 生成用户密码

工具:passwd, openssl  passwd# openssl  passwd  -1  -salt  SALT
# 同一个密码如果salt是一致的话,加密的结果也是一致的,如果salt有变,结果也会变
[root@LeeMumu ~]# openssl  passwd  -1  -salt  JC
Password: 12345
$1$JC$UB/4TUGIq/7L4rkXdMHbu1
[root@LeeMumu ~]# openssl  passwd  -1  -salt  JC
Password: 12345
$1$JC$UB/4TUGIq/7L4rkXdMHbu1
[root@LeeMumu ~]# openssl  passwd  -1  -salt  JT
Password: 12345
$1$JT$5tAJNzY6YMSc4vDOaRjX61

8.4 生成随机数

工具:openssl  rand
# openssl  rand  -hex  NUM
# openssl  rand  -base64  NUM
[root@LeeMumu ~]# openssl rand -hex 16                  # 生成 16*2 的随机数
b80ffcafcd9338d5963cc4ff495f1741
[root@LeeMumu ~]# openssl rand -base64 64               # 生成 64 位随机数,末尾的 == 在使用时需要删除
hdKmMfs2MbzgP/NeGa1eh/5v2AUVSI5ieMh/NdtkQjPqIcIEh6vBeSAvO/Hg6RQ/
O94sIMDxdpzYPDHjY8V84A==

8.5 公钥加密

加密解密:算法:RSA,ELGamal工具:openssl  rsautl, gpg
数字签名:算法:RSA, DSA, ELGamal
密钥交换:算法:DH
生成密钥:生成私钥: # (umask 077;  openssl  genrsa  -out  /PATH/TO/PRIVATE_KEY_FILE  NUM_BITS)# 带()的话, bash 会在子 shell 里执行此命令,这样的话 umask 不会改变,还是 022# 生产的私钥只能是自己拥有读写权限 提出公钥: #  openssl  rsa  -in  /PATH/FROM/PRIVATE_KEY_FILE  -pubout
[root@LeeMumu ~]# (umask 077; openssl genrsa -out /root/JT_PRIVATE_KEY 128)    # 生成私钥
Generating RSA private key, 128 bit long modulus
..+++++++++++++++++++++++++++
...+++++++++++++++++++++++++++
e is 65537 (0x10001)
[root@LeeMumu CA]# ll /root/JT_PRIVATE_KEY                                      # 查看是否创建成功
-rw-------. 1 root root 201 Jul 19 21:47 /root/JT_PRIVATE_KEY                   # 权限 600
[root@LeeMumu ~]# openssl rsa -in /root/JT_PRIVATE_KEY -pubout                  # 提出公钥
writing RSA key
-----BEGIN PUBLIC KEY-----
MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRAL/tl1QoX0br568x5rbKKVkCAwEAAQ==
-----END PUBLIC KEY-----
[root@LeeMumu ~]# cat /root/JT_PRIVATE_KEY
-----BEGIN RSA PRIVATE KEY-----
MGICAQACEQC/7ZdUKF9G6+evMea2yilZAgMBAAECEQC1ZmRfQIE8z1gicu9F+hL5
AgkA/cpLrHmtVd8CCQDBmWdEGJa3xwIIFDDqAFjV34UCCBTCEQuBI2/zAggRAN1U
MKK07g==
-----END RSA PRIVATE KEY-----

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

# /dev/random:仅从熵池返回随机数;随机数用尽,阻塞
# /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞# 伪随机数不安全# 熵池中随机数的来源:1、硬盘IO中断时间间隔2、键盘IO中断时间间隔

Linux 加密解密技术基础及OpenSSL介绍相关推荐

  1. 加密解密技术基础及用OpenSSL创建私有CA

    1.加密解密技术基础 (1)进程通信 传输层协议有TCP,UDP,SCTP等,端口号port表示进程地址,进程向内核注册独占使用某端口. 同一主机上的进程间通信方式:进程间通信(IPC), 消息队列( ...

  2. 加密解密技术基础、PKI及创建私有私有CA

    Linux基础中的加密.解密及openssl  数据为什么要加密?       由于互联网刚开始时使用的人非常少,在互联网中交流信息的人都比较"单纯"几乎没有安全问题:但随着互联网 ...

  3. 加密和解密技术基础、PKI及创建私有CA

    一.数据加密和解密概述 数据加密和解密是一门历史悠久的技术,从古代就已经出现了,一直发展到当代.其中,数据加密的目的有很多,可以是为了保证本地数据存取的安全性,可以是为了保证数据流在网络传输过程中的保 ...

  4. linux加密解密基础、PKI及SSL、创建私有CA

    linux加密解密基础.PKI及SSL.创建私有CA 1.加密解密基础:            数据在网络中传输过程中要保证三个要点: (1)数据的完整性:防止数据在传输过程中遭到未授权用户的破坏或篡 ...

  5. IOS加密技术之——3DES加密解密技术(记录)

    IOS常用加密技术有三种:3DES.SHA1和MD5.其中,对称加密技术有:3DES和SHA1:非对称加密技术有:MD5: 对称加密:加密解密用的是同一个密钥. 非对称加密:生成公有密钥和私有密钥.一 ...

  6. 开放平台的消息加密解密技术方案-柚果云开发日志

    一,消息加密解密 1) 注意:开放平台的消息加密解密技术方案基AES加解密算法 常见错误: xml 格式不对:如写成了 (s 小写了且 p 和>中间有空格 公众平台网站提供了修改 Encodin ...

  7. 17、加密解密技术介绍

    1.通讯机制: 同一主机间通讯机制:IPC.message quence,shm(共享内存),semerphone 不同主机间通讯机制:socket(ip:port),一般来说socket通讯都是成对 ...

  8. Linux加密解密 及使用openssl工具实现CA

    互联网迅速发展的今天,数据安全凸显其重要性 1.常见Linux加密方式 对称加密 公钥加密(非对称加密) 单向加密 2.详解加密解密 2.1 对称加密 对称加密算法: DES(56bits) AES( ...

  9. java中解密技术是什么_详解Java 加密解密技术的分类和归纳

    这篇文章主要介绍了Java加密解密基础分类方法汇总的相关资料,需要的朋友可以参考下 Java 加密解密基础: 密码学是研究编制密码和破译密码的技术科学.研究密码变化的客观规律,应用于编制密码以保守通信 ...

最新文章

  1. 每天一个JavaScript实例-apply和call的使用方法
  2. 8086汇编复习1 - 并使用emu8086模拟器查看效果
  3. 基本数据类型float和double的区别
  4. android6.0源码分析之Zygote进程分析
  5. 卷积云神经网络_2018.10
  6. 利用HttpClient 获取网页数据java代码模版
  7. asp判断是否移动端_asp判断用户端是电脑访问还是移动设备方法
  8. 20个很有帮助的 Web 前端开发教程
  9. R 梯度提升算法①
  10. URL编码 URLEncoder 示例
  11. 前端JavaScript之DOM事件操作~都是干货
  12. OSPF的Router-id确定顺序和冲突情况
  13. LeetCode 33 Search in Rotated Sorted Array(循环有序数组中进行查找操作)
  14. linux后台执行命令与putty打开程序界面 screen
  15. 相亲交友小程序,案例:情深深之恋
  16. 毕业设计之 - 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测
  17. 数字转换英语c语言程序,C语言编写的英语数字转化代码(数字转化为用英语表达的数字).doc...
  18. 手机突然显示无服务器,手机一直无服务是什么原因
  19. 17.项目开发中遇到的问题(this.$parent.$parent子组件调父组件的父组件的方法不可用问题)
  20. 双软企业的税收优惠政策

热门文章

  1. gui如何显示图片java_java gui中怎样使几个相关的几个图片交换着显示
  2. 发字的楷书写法图片_什么样的字体在高考中会加分?答案全在这里!​
  3. AndroidSDK Support自带夜间、日间模式切换详解
  4. HoneyFramework蜂巢框架六边形生成unity地图使用指导基础
  5. 谁才是真正的Vlog拍摄“神器”?橙影智能摄像机vs大疆Osmo Pocket
  6. Win11网络映射怎么设置?Win11添加映射网络驱动器的方法
  7. nanopolish中fast5文件multi_to_single和ont_fast5_api的使用
  8. android 行 64,android缺陷分析:内核空指针
  9. va_list与vsnprintf
  10. iOS swift 位置 定位 获取海拔