n 数据传输中常用的加密解密概念

   我们通过互联网发送和接收数据的时候有没有想过发送的数据会不会别人偷窥或篡改呢? 如果不会被别人偷窥那么计算机是怎么做到的呢?这就要了解有关加密解密的相关知识了。

   事实上我们的计算机中很多应用在传送数据的时候都经过不同的加密机制将数据加密后发送,然后接收方通过相对应的解密机制将收到的数据解密。

常用的加密方式

  • 对称加密DES, 3DES, AES

           机密性

  • 非对称加密(公钥加密)RSA, DSS, ECC

身份验正

机密性

密钥交换

    身份验正的实现方式发送方使用自己的私钥加密接收方只能用发送方的公钥解密能解密及验证了发送方身份。

        私钥加密的数据 --> 与之配对的公钥解密

        公钥加密的数据 --> 与之配对的私钥解密

  • 单向加密MD5, SHA1, SHA2, SHA256, SHA512, SHA3

        主要功能是通过哈希算法提取数据的特征码用来验证数据没有被篡改。

        数字签名:发送方使用单向取得数据特征码并使用自己的私钥加密此段特征码的操作

通过这些加密解密算法的配合运用保证了数据传输的安全性私密性可用性。


n Openssl的应用

一、Openssl简介

Openssl是一个能实现加密解密和自建CA的开源程序包。主要有三部分组成。

1、Libcrypto是一个能实现加密解密的公共库。系统中很很多程序都依赖到这个库。

2、Libssl为了实现ssl功能。绝大多要实现ssl功能的程序所依赖。https会话层。

3、Openssl实现加密解密多功能的工具。

二、Openssl工具使用方法

  我们可以使用openssl 来显示openssl可用选项及常用命令 。也可以直接man openssl后长跟选项的用法比如你可以实现 man enc 、man dgst...(请自行摸索)这里我们来用openssl 来展示一下大体选项。  

wKiom1McgLqQ7vQdAAOuP1pOVN8110.jpg


2.1 使用openssl enc 加密数据

   这里我们加密/etc/issue.并保存到当前root家目录下以issue.des3命名

[root@station57 ~]# openssl enc -des -in /etc/issue -e -out /root/issue.des3
enter des-cbc encryption password:
Verifying - enter des-cbc encryption password:

-des表示使用des加密方式

-in要加密的文件

-e加密<----->-d:解密

-out加密后输出路径如果我们只是加密不需要保存的话就不用-out了。

命令执行结束后会让我们输入加密密码并确认密码。

此时/etc/issue文件就已经通过des加密方式加密并保存到/root/issue.des3

[root@station57 ~]# ls
anaconda-ks.cfg        nginx-1.4.5
httpd                 issue.des3

因为是加密过的数据所以我们用cat查看 就是一堆乱码了

[root@station57 ~]# cat /root/issue.des3
{c応娗)@euFI\…~_W>/慄k|An-
                               2oX+yMˉ*§E’—*·°IΠFf|~6+rQ

用-d选项查看加密的内容当然这里必须要输入刚刚加密的密码了。

[root@station57 ~]# openssl enc -des -in issue.des3 -d -out issue
enter des-cbc decryption password:
[root@station57 ~]# cat issue
CentOS release 6.4 (Final)
Kernel \r on an \m
Mage Education Learning Services
 My neme is xuqimin ,this is my computer;
http://www.magedu.com

Ok这就是我们在linux中加密一个文件的过程

当然如果我们仅仅是加密一串数据不需要保存也可以这样用

[root@station57 ~]# echo 123 | openssl enc -des3
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
Salted__???$?d?>??


2.2 使用openssl dgst 获取数据的特征码。(md4、md5、md2..)


       鼓励大家多多用man手册查看具体使用方法。这里是man dgst的显示结果摘要。  

openssl dgst
       [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c]
       [-d] [-hex] [-binary] [-out filename] [-sign filename]
       [-keyform arg] [-passin arg] [-verify filename] [-prverify
       filename] [-signature filename] [-hmac key] [file...]

       我们还以issue这个文件为例使用openssl dgst获取它的特征码。这里使用md5

[root@station57 ~]# openssl dgst -md5 issue
MD5(issue)= 3642653878b64529471d7a065bd51448

   我们往这个文件里加一个小数据“1”.来验证一下什么叫md5的雪崩效应。

[root@station57 ~]# echo 1 >> /root/issue
[root@station57 ~]# openssl dgst -md5 issue
MD5(issue)= b3a7a51a34128a32c6fe7bb193e0160e

看到了吧!仅仅是向issue文件中追加进去一个字符,导致前后特征码完全不一样。小小的变化大大的结果差异。这就是md5的雪崩效应。


2.3 Openssl speed 来测试当前主机的加密速度。

这个命令可以测试你的电脑的加密速度,当然也就反映了你电脑的性能了。

我们来测试一下电脑对sha512加密方法的加密速度

[root@station57 ~]# openssl speed sha512
Doing sha512 for 3s on 16 size blocks: 2680685 sha512's in 2.99s
Doing sha512 for 3s on 64 size blocks: 2682484 sha512's in 3.00s
....

             如果直接执行 openssl speed 不加参数,则会自动测试每个加密方法的加密速度。

2.4 Openssl passwd  类似linux系统中实现用户密码的方法man sslpasswd

[root@station57 ~]# openssl passwd
Password:
Verifying - Password:
Uz1H.qZ3P5JQE
[root@station57 ~]# openssl passwd
Password:
Verifying - Password:
JVA6LkZpAtBFw

   看到了没,两次加密后生成的字符串不一样。你是不是该说我两次输入的秘密一样结果肯定一样了。你可真是错了,我两次加密的数据是一样的。但是结果为什么不一样了呢?因为这个加密工具默认给我输入的数据前面又添加了点别的随机字符串salt,所以用每次加密相同的秘密结果却不一样。这就像我们linux系统中shadow文件夹中保存的密码一样,两个用户的密码一样,但是经过系统加密保存后却没有一位相同。

  我们也可以用这个命令加点参数指定salt的值。其他更多选项详见man sslpasswd

-1:表示使用的加密方式是md5

-salt指定使用的salt

如果两次指定相同的salt结果也就一样了。

[root@station57 ~]# man sslpasswd
[root@station57 ~]# openssl passwd -1 -salt hellolinux
Password:
$1$hellolin$U22lq0Cpt4.xQku/mq2G00
[root@station57 ~]# openssl passwd -1 -salt hellolinux
Password:
$1$hellolin$U22lq0Cpt4.xQku/mq2G00


2.5 Openssl rand 生产随机数种子

可以用这个命令生成一个随机数种子,这个随机数还可以用来充当我们的salt

[root@station57 ~]# openssl rand -hex 3
ea177c
[root@station57 ~]# openssl rand -hex 1
bd
[root@station57 ~]# openssl passwd -1 -salt `openssl rand -hex 4`
Password:
$1$5dedff6c$cPfH/zxH3ixNFs6WfthBT0
[root@station57 ~]# openssl passwd -1 -salt `openssl rand -hex 4`
Password:
$1$4d350d85$gRTZYA6Bubqv1gEutKgD5.


2.6 Openssl genrsa生产RSA私钥

我们可以直接用命令openssl genrsa生产一串rsa密钥。但是这样的密钥直接放在我们计算机里也是不安全的。为了密钥的安全建议通过下面介绍的方法对密钥再进行加密

wKiom1Mcgd3REC7-AATmh7hVXGM625.jpg

 选项

      -des3选择使用des3加密生产的密钥

1023生成的密钥位数默认是512位。

-out讲生成的密钥导出到文件当然我们也可以用输出重定向导出。


2.7 Openssl rsa 从私钥中提取公钥

    生成一个私钥保存为key.pri然后从私钥中提取出公钥

[root@station57 ~]# openssl genrsa -out key.pri
Generating RSA private key, 512 bit long modulus
.........++++++++++++
.........++++++++++++
e is 65537 (0x10001)
[root@station57 ~]# openssl rsa -in key.pri -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALMqqinkFOwbb5LQHRXr18oL2Zch4EAi
HgkD2jsR7qXdIdJoQlM+CDkeDJV8EnuX7APrQtbnwLl70W9NqqtUdCkCAwEAAQ==
-----END PUBLIC KEY-----

这样就生成了对私钥和与之对应的公钥了

创建完私钥记得修改权限啊~这可是机密信息。


2.8 Openss req证书制作请求和生成工具

[root@station57 ~]# openssl req -new -key /root/key.pri -out /root/myreq.csr

wKiom1McgizwHADdAAO7YLg9iW0852.jpg

  -new申请一个新证书

  -key生成的key的位置

  -out制作的请求文件放置的路径(证书请求文件一般用.csr结尾)

这时候就会在我们的指定的目录下生成一个证书申请文件myreq.csr,然后我们就可以把这个文件发送到CA机构去让CA签署生效了。但是可别忘了让CA签名可是要收费了因为CA要负责验证你提交的信息是否合法,会去你部门核实情况。

因此如果单单是为了测试或者内部网络使用的话我们自建CA还是比较靠谱的。

      Ok学会了openss工具的这个几个小命令的用法后我们来自建一个CA吧~


n 自建CA详解

数字证书包含的内容

版本号

序列号():证书本身在CA中惟一标识

签名算法标志

发行者名称

有效期

证书主体名称(组织,个人)

证书主体公钥信息

发行商惟一标志

证书主体的惟一标志

扩展

签名

       PKI: 需要涵盖的范围

端实体(申请者)

注册机构(RC)

签证机构(CA)-->签证机构(CA)

证书撤消列表(CRL)发布机构

证书存取库

openssl中有如下后缀名的文件

   .key格式私有的密钥

   .crt格式证书文件certificate的缩写

   .csr格式证书签名请求证书请求文件含有公钥信息certificate signing request的缩写

   .crl格式证书吊销列表Certificate Revocation List的缩写

   .pem格式用于导出导入证书时候的证书的格式有证书开头结尾的格式

 整个证书的初始信息需要我们自己填写,这有点像我们申请贫困证明一样,我们自己填写一个表单包含自己个人信息、家庭情况什么的,然后拿去民政部门核实,核实通过盖一个章然后这个证明就生效了。前面已经讲过了证书的请求制作过程的命令Openssl req。

 OK,在我们准备使用openssl自建CA的时候先来看一下openssl的配置文件吧。配置文件里定义了ca各种文件数据保存路径、吊销的证书列表、证书申请时候输入信息匹配设置等等信息,请自行查阅。配置文件位置在/etc/pki/tls/openssl.cnf.

 好了废话不多说了是不是你们也听烦了 Ok我们来实战吧...

一、为CA生成私钥

主机在网络通信中需要CA为其颁发证书,那么充当CA的服务器本身的证书有谁来颁发呢?由于我们是自建的所以这里是我们自己的CA自己颁发。因此要自建CA,首先需要CA自己为自己创建一个证书。

这里我们首先要切换到 /etc/pki/CA目录中创建一个私钥

[root@station57 ~]# cd /etc/pki/CA
[root@station57 CA]# ls
certs  crl  newcerts  private
[root@station57 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
......................................................................+++
..........................................................................................................................................................+++
e is 65537 (0x10001)
[root@station57 CA]# ll private/cakey.pem
-rw------- 1 root root 1679 Mar  8 07:07 private/cakey.pem

上边命令外的括号表示把此命令放入到子shell中执行,为了避免设置umask为077后影响到父shell。

通过以上命令我们在private目录中生成了一个2048位的私钥cakey.pem,并且只有管理员有可读权限

二、生成自签证书

[root@station57 CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacer.pem -days 200 wKiom1McgsfgpaefAAMQsYAYVl8705.jpg

           -x509自建证书的格式加此参数表示自签证书

Cacer.pem :此文件名是由配置文件中规定的

-days规定证书有效期天数

三、生成序列号文件数据库文件

我们已经建成了ca的私钥和自签证书,那么根据配置文件中定义的所需要的文件目录,我们还缺少两个文件一个数据库文件和一个序列号文件。创建之...

[root@station57 CA]# touch serial index.txt
[root@station57 CA]# echo 01 > serial
[root@station57 CA]# ls
cacer.pem  certs  crl  index.txt  newcerts  private  serial

四、Ok.CA已经建好让我们来发挥它的作用签个证书吧。

还记得上一项我们介绍openssl工具使用方法的时候创建的那个申请了不也就是上一项第八个例子。 让我们的CA来为它签字吧。

[root@station57 CA]# openssl ca -in /root/myreq.csr -out mycert.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Mar  8 01:16:01 2014 GMT
            Not After : Mar  8 01:16:01 2015 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Henan
            organizationName          = nyist
            organizationalUnitName    = soft
            commonName                = 172.16.20.61
            emailAddress              = 345759785@qq.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                1A:1A:3C:D7:36:19:C5:07:B2:E5:BA:2E:6A:C7:C5:CB:0C:54:78:9F
            X509v3 Authority Key Identifier:
                keyid:B0:95:27:ED:A2:A2:40:94:0E:28:36:1A:27:B3:C7:62:CB:14:2E:B5
Certificate is to be certified until Mar  8 01:16:01 2015 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

证书制作好了,那它生成了什么文件呢,文件内容又是什么?Ok让我来带你们看看

[root@station57 CA]# ls
cacert.pem  crl        index.txt.attr  mycert.crt  private  serial.old
certs       index.txt  index.txt.old   newcerts    serial
[root@station57 CA]# cat index.txt
V150308011601Z01unknown/C=CN/ST=Henan/O=nyist/OU=soft/CN=172.16.20.61/emailAddress=345759785@qq.com
[root@station57 CA]# cat serial
02

Mycert.crt :这就是我们的证书

Index.tex 记录着当前签的证书的信息

Serial证书编号也就是从几号来开始创建证书。

Ok、、、大功告成~