简述网络通信安全技术及openssl命令行工具的基本使用
在互联网诞生的早期,接入互联网的主机数量不多,应用也很少。因此早期设计的协议都没有考虑到数据安全,数据在网络上都是明文传输的,非常不安全。由于互联网的迅速发展,接入互联网的主机越来越多。网络安全问题也层出不穷。那么如何在互联网上安全的传输数据呢?加密技术在其中就起到了很大的作用。
借此,ISO(国际标准组织)定义了x.800安全框架,框架基本结构如下:
安全***:
被动***:窃听数据
主动***:伪装、修改消息、删除消息、重播消息
安全服务机制:
认证:验证消息的发送方是不是发送方自己声称的那个人
访问控制:只允许用户访问授权给用户资源
数据保密性:
连接保密:数据流保密(tcp连接)
无连接保密:数据包加密(udp)
选择域保密:对数据流或者数据包中的部分数据进行加密
流量保密:对向互联网上发送的真实数据的流量大小进行加密
数据完整性:保证数据从消息发送方到达消息接收方时没有经过非授权更改
不可否认性:一旦通讯发生,通讯双方都不能否认
由于加密算法大多数都是公开的,纯粹用算法对数据进行加密是不安全的。因此现在的加密算法在加密的数据的时候会同时输入一段密钥,以保证数据的安全性。
数据加密流程:
数据解密流程:
实现上述安全服务机制是需要算法参与的,算法的类型主要有以下几种:
对称加密:
特性:加密解密使用同一个密钥。
优势:加密速度快
劣势:当一个用户需要跟众多用户进行安全通讯时需要维护众多密钥。
公钥加密(非对称加密):
特性: 加密解密使用一对密钥(公钥、私钥),公钥是从私钥中提取出来的
用公钥加密的数据只能用与之配对的私钥解密
用私钥加密的加密的数据只能用与之配对的公钥解密
公钥是公开的,任何人都可以得到,并使用
私钥是不公开的,只有私钥持有者可以使用
常见算法:rsa、dsa
优势:只需要维护一对密钥就可以跟众多用户进行安全通讯。
劣势:加密速度慢,一不会用它来进行大
单向加密:
特性:只加密,不解密。提取数据特征码
定长输出:不管输入的数据有多大,输出的特征码的长度都输固定的
蝴蝶效应:输入数据的微小改变会引起输出的特征码的巨大变化
md5(128bit)、sha1(160bit)、sha192、sha256、sha384、sha512
现在互联网上常用的安全通讯模型:
发送方发送数据时执行的步骤如下(分别对应于上图发送方的1、2、3):
1、发送方将需要在互联网上进行安全传输的数据采用单向加密算法提取数据的特征码,然后用自己的私钥加密这段特征码放在数据的尾部;
2、发送方生成一个一次性的对称加密算法的秘钥,然后使用对称加密算法和生成的秘钥将数据和加密后的特征码加密后生成密文;
3、将上一步对称加密用到的秘钥使用接收方的公钥加密后放在密文的后面;随后就可以将数据放到互联网上进行传输。
接收方接收到数据后执行的步骤如下(分别对应于上图接收方的1、2、3):
1、接收方接收到数据后,用自己的私钥解密加密后的对称加密算法的秘钥。(如果能解密则能验证数据的机密性)
2、接收方用解密后得到的对称加密算法的秘钥后使用与发送方同样的对称加密算法解密加密的数据和加密的数据的特征码。
3、接收方使用与发送方相同的单向加密算法提取解密后的数据的特征码,而后使用发送方的公钥对上一步解密得到的加密的数据的特征码(如果能解密,则可以验证接收方的身份),并比较这两个特征码进行比较是否一致。(如果一致,则可以验证数据的完整)。
上面讲到了单向加密、对称加密、非对称加密等算法。那这几种类型的算法该如何实现呢?有没有什么可靠的工具呢?在linux上有一款非常好用的,并且能够实现上述的所发的开源软件openssl,下面我就介绍openssl:
openssl的组成部分:
/usr/bin/openssl:openssl多用途的命令行工具
/usr/lib64/libcrypto.so.10:第三方软件借助openssl实现数据加密功能的库文件
/usr/lib64/libssl.so.10:第三方软件借助openssl实现ssl功能的库文件
openssl的具体应用
获取openssl工具的帮助:
[root@localhost ~]# openssl help openssl:Error: 'help' is an invalid command. # 此行错误可以忽略 Standard commands asn1parse ca ciphers cms crl crl2pkcs7 dgst dh dhparam dsa dsaparam ec ecparam enc engine errstr gendh gendsa genpkey genrsa nseq ocsp passwd pkcs12 pkcs7 pkcs8 pkey pkeyparam pkeyutl prime rand req rsa rsautl s_client s_server s_time sess_id smime speed spkac ts verify version x509 Message Digest commands (see the `dgst' command for more details) md2 md4 md5 rmd160 sha sha1 Cipher commands (see the `enc' command for more details) aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb aes-256-cbc aes-256-ecb base64 bf bf-cbc bf-cfb bf-ecb bf-ofb camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb camellia-256-cbc camellia-256-ecb cast cast-cbc cast5-cbc cast5-cfb cast5-ecb cast5-ofb des des-cbc des-cfb des-ecb des-ede des-ede-cbc des-ede-cfb des-ede-ofb des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb des-ofb des3 desx idea idea-cbc idea-cfb idea-ecb idea-ofb rc2 rc2-40-cbc rc2-64-cbc rc2-cbc rc2-cfb rc2-ecb rc2-ofb rc4 rc4-40 seed seed-cbc seed-cfb seed-ecb seed-ofb zlib
单向加密(提取文件特征码):
用法:openssl dgst [-md5|-md4|-md2|-sha1|-sha] [file...] 示例: [root@localhost ~]# openssl dgst -md5 /etc/passwd MD5(/etc/passwd)= cde0b986a93a765834fe7183e53dc16d # dgst:指定用openssl工具实现提取文件特征码, # -md5:指定使用MD5算法提取文件特征码
对称加密:
用法:openssl enc -ciphername [-in filename] [-out filename] 示例: [root@localhost ~]# openssl enc -des3 -in /etc/passwd -out /tmp/passwd.enc enter des-ede3-cbc encryption password: Verifying - enter des-ede3-cbc encryption password: # 输入两次密码对文件进行加密 [root@localhost ~]# file /etc/passwd /etc/passwd: ASCII text # 明文 [root@localhost ~]# file /tmp/passwd.enc /tmp/passwd.enc: data # 密文 [root@localhost ~]# openssl enc -des3 -in /tmp/passwd.enc -out /tmp/passwd.2 -d enter des-ede3-cbc decryption password: # 输入加密时使用的密码对文件进行解密 [root@localhost ~]# file /tmp/passwd.2 /tmp/passwd.2: ASCII text # 明文
生成非对称密钥中的私钥(由于非对称密钥通常不用来进行数据加密,因此此处不介绍如何用非对称密钥对数据进行加密)
用法:openssl genrsa [-out filename] [numbits] 示例: [root@localhost ~]# openssl genrsa -out /tmp/key.pri 2048 Generating RSA private key, 2048 bit long modulus .......................+++ ...+++ e is 65537 (0x10001)
从私钥中提取与之对应的公钥
用法:openssl rsa [-in filename] [-pubout] [-out filename] 示例: [root@localhost ~]# openssl rsa -in /tmp/key.pri -pubout -out /tmp/key.pub writing RSA key
生成随机数
用法:openssl rand [-hex] num -hex:基于十六进制生成随机数 示例: [root@localhost tmp]# openssl rand -hex 6 d13a62e6cdb0