首页 > 代码库 > 加密、解密的原理及Openssl创建CA和ssh的基础应用

加密、解密的原理及Openssl创建CA和ssh的基础应用

加密、解密的原理及Openssl创建CAssh的基础应用

随着互联网的不断发展和技术的不断成熟,在互联网上传输文件不在安全,在需要传送重要的数据时就必须加密处理。

密码算法分为三种:分别是对称加密,公钥加密,单向加密;以及需要对加密算法的认证,叫做认证协议。下面为大家概述对称加密,公钥加密,单向加密及认证协议

 

对称加密:

         采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。 需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。

密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。因此安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。对称加密固然能够保证数据的机密性,但无法保证数据的完整性和可用性;当一台PC机需要和众多的设备通信时,就必须保持众多密码,因为要保证唯一性。

常用的对称加密有:DES: Data Encryption Standard(数据加密标准)、3DES、Blowfish 、Twofish 、IDEA 、RC6 、AES(128,192,256,384,512)、CAST5算法等

 

图解:

    wKioL1Pd5V7w4IU2AAHGZ1JMGLM208.jpg

 

 

 

加密的工具:

gpg openssl enc

使用命令:

    # openssl enc -des3 -a -salt -in /path/from/somefile -out/path/to/somecipherfile

加密  -a:表示已base64的方式加密(对文本文件一般都用base64的方式)

# openssl enc -d-des3 -a -salt -in /path/from/somecipherfile -out /path/to/somefile

解密  -d:表示解密

例:

wKiom1Pd5FqhTeTLAAEeGV7XJDg636.jpg

使用命令对ks.cfg文件加密,然后查看加密结果

wKioL1Pd5YTDgKL4AAHHFk6BcZU653.jpg

然后删除原文件,使用解密命令查看解密结果

 

 

非对称加密(公钥加密):

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法

特点:

私钥加密的数据-->与之配对的公钥解密 实现身份验证

公钥加密的数据-->与之配对的私钥解密 实现数据的机密性

加密的数据是对称加密的三个数量级,所以非对称加密算法很少对数据进行加密,大部分用于密码加密。

功能:

 

    wKiom1Pd5K6CdwRuAAEUeOxE2yc572.jpg

身份验证、机密性、密钥交换

常用的加密算法:

       RSA, DSA,EIGamal

工具:

gpg, openssl rsautl

图解:

 

使用命令:

    例:#openssl genrsa  -out/path/to/keyfile NUMBEROFBITS

       生成密钥

       wKioL1Pd5g3jY0kzAAOmkmL1B4g760.jpg

生成一个2048位的密钥,追加存放在mykey中,但是创建完后的权限是所有用户都可以看的,所有需要再次修改权限,也可以直接使用命令# (umask 077; openssl genrsa -out /path/to/keyfile NUMBEROFBITS )-out表示直接保存在文件中,不使用重定向

        wKioL1Pd5hiyJDoKAAF-EDZhPmg561.jpg

使用# openssl rsa -in /path/from/private_key_file –pubout命令提取公钥

 

单向加密

散列函数也叫做HASH函数,主流的散列算法有MD5与SHA-1、SHA256、SHA384、SHA512。散列函数的主要任务是验证数据的完整性。通过散列函数计算得到的结果叫做散列值,这个散列值也常常被称为数据的指纹(Fingerprint)也叫数字签名。基于单向加密机制,openssl还支持MAC,MAC是消息摘要码,单向加密的一种延伸类的应用,能够在不基于公钥不加密的方式下,完成信息完整性认证。主要作用于实现在网络通信中保证所传输的数据的完整性。实现MAC算法有两种,分别是CBC-MAC和HMAC,其中HMAC比较简单,使用的是md5或sha1算法。

特点:

输入一样,输出必须相同

雪崩效应:输入的微小改变,将会引起结果的巨大改变

定长输出:无论原始数据是多大,结果大小都相同的

加密过程不可逆,无法根据特征码还原原来的数据

工具:

md5sum, sha1sum, openssl dgst, chsum

算法:

    md5: 128bits、sha1: 160bits、sha256、sha384、sha512

使用命令:

    # openssl dgst [-md5|-sha1] [-out/path/to/filename] /path/from/somefile

 

因为三种加密算法都有自己的缺陷,也都有自己的优点,所以把三种算法都结合起来,安全性就大大的加强了,以下是实现过程:

理想完整的安全发送流程:

加密:

1、发送方使用选定的单向加密算法计算原始数据的特征码;

2、发送方使用自己的私钥加密特征码,附加于原始数据后面;

3、)

4、发送方使用接收方的公钥加密一次性对称密钥;附加于加密数据后面

解密:

1、接收方使用自己的私钥解密加密的一次性对称密钥;

2、使用对称密钥解密数据,得到加密的特征码和原始数据;

3、使用发送方公钥解密加密的特征码;

4、使用与发送方相同的单向加密算法重新计算数据的特征码,并与解密出的特征作比较

(两个主机进行通信时,当发送方先生成一个原始数据,先使用单向加密算法获取其特征码,然后用自己的私钥加密这段数据的特征码放在数据的后面;再生成一个临时性的对称密钥,对整个数据做加密;再用对方的公钥加密密码并附加在加密数据的后面;然后发送给接收方。

接收方收到后用自己的私钥去解密这段加密的数据,这个数据由于只有私钥对应的公钥才能解密,得到对称密钥信息,使用此对称密钥的信息解密单向加密的信息,使用对方的公钥解密特征码,然后接收方使用同样的单向算法计算特征码,并比较加密的结果和解密的结果是否一致,这就叫数据完整性验证)

 

图解:

         wKiom1Pd5RqhjhSNAAMI26AFjK8663.jpg

 

 

 

但是如何合法的获取对方的公钥就变成这种模式最重要的一步,所有就必须有一个第三方的公信力机构来验证。验证过程就是要用对应给用户颁发证书的CA的公钥来解密CA后面的签名,如果能解密就说明可证明是CA所颁发的;用户使用解密出来的特征码对比自己加密出来的特征码是否一样,如果一样就可证明证书的完整性是没问题的;验证过后还要再查看证书的是否在可使用时间内,再检查是否在吊销库中,如果都没问题便可开始正常通信

 

Openssl建立私有CA

 

  • 建立CA服务器:

1、生成密钥

wKiom1Pd5XzCFEsJAACb2GgUa-0937.jpg

         使用# (umask077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)命令生成密钥

2、自签证书

         wKiom1Pd5YTDF7XWAAJlxUNHu4w806.jpg

使用命令# openssl req-new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days100,发起证书签署请求;然后在请求中填上必要信息

req:生成证书签署请求

                       -news:新请求

                       -key  /path/to/keyfile:指定私钥文件

                       -x509:生成自签署证书       

                       -days n:有效天数

3、初始化工作环境(第一次配置服务时需要用到)

                   #touch /etc/pki/CA/{index.txt,serial}

                   #echo 01 > /etc/pki/CA/serial

 

  • 节点申请证书

1、  节点生成请求

        1)  生成密钥对

            wKioL1Pd5qnxC1VOAACbnGLZYt4960.jpg

         2)生成证书签署请求

                                     wKioL1Pd5sfSKIGIAAKfVXpTjBU067.jpg

2、  签署证书

1)验证证书中的信息

2)签署证书

3)发送给用户

wKiom1Pd5k6C9ruMAANlbxYunA8635.jpg

因是在同一台主机上,可直接签署证书(*.crt表示是证书的后缀名);然后查看已经签过的证书,然后发送给请求方即可

 

     在另一台节点上做签署请求

       wKiom1Pd5mnDJo6eAACV1-ZU37k348.jpg

    生成密钥对

        wKiom1Pd5oiz8GxZAAKrQYTl8X8620.jpg

    在另一个节点生成证书签署请求

        wKioL1Pd58mhA_BuAACiWxig-5k703.jpg

     在CA服务器上创建一个csr文件用以存放签证请求

        wKioL1Pd5_vCOTjNAABnnfge3A8269.jpg

    在另一个节点上将生成的证书签署请求发送给CA服务器

        wKioL1Pd6BOiy7fsAAKjnb1_OEY541.jpg

    在服务端签署节点发来的请求

        wKiom1Pd5yLxC0pAAAE9ipQOBRU260.jpg

    在服务器段签署完后发送给节点

 

三、吊销证书(当节点出现自己私钥丢失的情况时需要吊销证书)

1、  由节点请求吊销

    1)获取证书serial(序列号)

#openssl x509 –in /path/to/certificate_file.crt –noout–serial-subject

2、  CA服务器

    1)  根据节点提交的serialsbuject信息来验证与index.txt文件中的信息是否一致;

    2)  吊销证书

# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

    3)  生成吊销证书的编号(如果是第一次吊销需要生成编号)

#echo 00 > /etc/pki/CA/crlnumber

    4)  更新证书吊销列表

        # cd /etc/pki/CA/crl

        # openssl ca –gencrl crl/thisca.crl

如果需要查看吊销列表,使用命令openssl crl –in /path/to/crlfile.crl –noout -text

Openssh的使用

         OpenSSH是一组用于安全地访问远程计算机的连接工具。它可以作为 rlogin rsh rcp 以及 telnet 的直接替代品使用。更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。 OpenSSH 对所有的传输进行加密, 从而有效地阻止了窃听、 连接劫持, 以及其他网络级的攻击。OpenSSH OpenBSDproject 维护。

登录过程和使用 rlogin telnet 建立的会话非常类似。 在连接时, SSH 会利用一个密钥指纹系统来验证服务器的真实性。 只有在第一次连接时, 用户会被要求输入 yes 之后的连接将会验证预先保存下来的密钥指纹。 如果保存的指纹与登录时接收到的不符, 则将会给出警告。 指纹保存在~/.ssh/known_hosts 中,对于 SSH v2 指纹,则是 ~/.ssh/known_hosts2

默认情况下, 较新版本的 OpenSSH 只接受 SSH v2 连接。 如果能用版本 2 则客户程序会自动使用, 否则它会返回使用版本 1 的模式。 此外, 也可以通过命令行参数 -1 -2 来相应地强制使用版本 1 2 保持客户端的版本 1 能力是为了考虑较早版本的兼容性。

 

    openssh的客户端组件:

         ssh:配置/etc/ssh/ssh_config

         ssh[username@]host [COMMAND]

         ssh-l username host [COMMAND]

            wKiom1Pd6Bixl_FEAABb7I0hgr4411.jpg

 

scp: 利用ssh协议在主机之间实现安全文件传输的工具

                   scp SRC1... DEST

       

分两种情形:

     1、源文件在本机,目标为远程

            # scp/path/to/somefile... USERNAME@HOST:/path/to/somewhere

 wKiom1Pd6MHxAegcAAEoPzQqDWQ156.jpg

  复制文件到另一台主机的/tmp/目录

    


          2、源文件在远程,本地为目标

                  #scp USERNAME@HOST:/path/to/somewhere /path/to/somewhere

 

                 -r: 复制目录时使用

                 -p: 保持源文件的元数据信息,包括modetimestamp

                 -q: 静默模式

               

 

sftp: 基于sshftp服务

        用法:sftpUSERNAME@HOST

 

         wKioL1Pd6lHTa3-9AACBMJUsfWo008.jpg

       使用sftp命令就可直接进行上传下载

 

openssh的服务器端:sshd

         配置文件:/etc/ssh/sshd_config

         服务脚本:/etc/rc.d/init.d/sshd

         脚本配置文件:/etc/sysconfig/sshd

 

sshd认证方式:

        1、基于口令的认证;

        2、基于密钥的认证;

           #ssh-keygen -t rsa

             默认密钥为id_rsa,id_rsa.pub

 

 

1、  第一种方法

wKioL1Pd6prjvCBzAAFepFZO4ek815.jpg

 使用ssh-keygen –trsa命令生成

wKiom1Pd6ZDho7VEAABWZl1dMjQ451.jpg

查看已经生成的文件

wKiom1Pd6ZrjWvMxAABvNWrBslU682.jpg

将文件发送给另一台主机

wKiom1Pd6abifTW0AABbD1jgiZA291.jpg

创建ssh文件,将发送过来的文件追加至auehorized_keys

wKiom1Pd6d_gqBZkAABMSo41aAk570.jpg

然后使用原来的主机进行验证

 

 

也可使用另一中更方便的方法

wKioL1Pd6ZKQzD7-AAFZ54auhbU176.jpg

命令直接生成密钥,不用交互式操作

-f /path/to/somefile: 密钥文件保存位置

                   -P ‘‘: 指定oldpassword


    wKioL1Pd6U_SyAekAADVm6MDcNU297.jpg

然后使#ssh-copy-id -i .ssh/id_rsa.pub USERNAME@HOST命令直接将文件发送给另一台主机,然后登录即可


本文出自 “学习ING” 博客,请务必保留此出处http://nydia.blog.51cto.com/6404696/1534976