天天看點

17、加密解密技術介紹

1、通訊機制:

    同一主機間通訊機制:IPC、message quence,shm(共享記憶體),semerphone

    不同主機間通訊機制:socket(ip:port),一般來說socket通訊都是成對出現:CIP:PORT<--->SIP:PORT

2、傳輸層協定:

tcp、udp、sctp;傳輸層協定單元為段,用端口區分不同應用    

port用來辨別程序位址;程序向核心注冊使用某端口(獨占的)

3、如何保證安全的資訊通訊?

    ssl:secure socket layer:安全套接字層,ssl是一種規範協定

4、資訊安全目标:

    保密性:confidentiality;確定通訊的保密性

    完整性:integrity;確定資訊的完整性,展現在資料的完整性和系統完整性兩個層面

    有效性(可用性):

5、攻擊類型:

    威脅保密性的攻擊:竊聽、通信量分析

    威脅完整性的攻擊:更改、僞裝、重放、否認

    威脅可用性的攻擊:決絕服務

6、安全實作手段:安全通訊解決方案

    通過技術實作:加密和解密       

        傳統加密方法:替代加密、置換加密

        現代加密方法:現代塊加密技術,将存在硬碟上的資料,分成塊進行加密。   

    通過服務實作:用于抵禦攻擊的服務,也就是說為了實作上述安全目标而特地設計的安全服務。

        認證機制

        通路控制機制

        秘鑰算法和協定(專用于密碼交換)

6.1、linux系統實作上述解決方案工具主要有兩個:openssl、GPG

   openssl由三部分組成:

    libencrypt庫:實作加密解密的庫

    libssl庫:實作ssl安全通信的庫

    openssl工具:指令行工具,多用途,可以實作前兩者的功能

6.2、密鑰算法和協定:

    對稱加密:主要用來加密資料;DES、3DES、AES

    公鑰加密:主要用來加密對稱加密密鑰;RSA、DSA

    單向加密:主要用來提取資料特征碼;md5、sha1、sha224、sha256、sha384、sha512

    認證協定:主要用來進行密鑰交換

6.2.1、對稱加密:

    加密和解密使用同一個密鑰,但是加密和解密的算法可能不同。

    對稱加密算法主要有:des(56位加密技術)、3des、aes(advance encryption standard;128bits、192bits、256bits、384bits)、blowfish、twofish、idea、rc6等等;常用的是3des和aes。

    對稱加密特性:

        ①、加密解密使用同一個密鑰

        ②、将原始的資料分隔成固定的大小的塊,逐個進行加密

    對稱加密的缺陷:

         ①密鑰過多(展現在服務端和衆多用戶端通訊時,需要每個通訊都有一個單獨的密鑰)

         ②密鑰分發困難

6.2.2、公鑰加密:

    密鑰成對出現,有公鑰和私鑰。

       公鑰:publickey,公開給所有人;公鑰從私鑰中提取産生

      私鑰:secretkey:通過工具建立;使用者自己留存,必須保證其私密性。

    公鑰加密特性:

        ①、用公鑰加密的資料隻能由對應的私鑰進行機密,反之亦然。

    公鑰加密用途:

        ①、數字簽名:主要在于讓接收方确認發送發的身份。

        ②、密鑰交換:發送方用對方公鑰加密一個對稱密鑰,發送給對方。

        ③、資料加密:主要加密對稱密鑰

數字簽名的實作過程:

  以a使用者和b使用者通訊為例

    ①、a使用者發送資料給b使用者,a需要用到單向算法提取發送資料的特征碼,由于單向算法有雪崩效應,改動很小一部分,特征碼就會發生很大變化

    ②、a使用者用自己的私鑰加密這段特征碼,并将其附加在這段資料的後面(如果用私鑰加密原始資料,消耗記憶體、cpu)

    ③、a使用者生成一個臨時的對稱加密密鑰,并使用這個密鑰加密原始資料和特征碼,生成的新的資料

    ④、a使用者擷取b使用者的公鑰,并用b使用者的公鑰加密a的對稱密碼,将其附在③中新生成資料包的後面,然後将整個資料包發送給b使用者。

    ⑤、b使用者用自己的私鑰去解密a使用者用b的公鑰加密的資料,得到③中的資料和④中的加密後的對稱密鑰并将其解密成明文對稱密鑰。

    ⑥、b使用者用a的對稱密鑰解密③中的資料,得到原始資料和原始資料提取的加密後的特征碼

    ⑦、b使用者用a的公鑰去解密②中的a私鑰加密的特征碼,如果可以解密,a使用者的身份得到驗證。

    ⑧、b用同樣的單向加密算法去計算原始資料的特征碼,如果一樣,完整性得到了驗證,否則說明資料被篡改過。

其中①-④說明了加密的過程,⑤-⑧說明了數字簽名和完整性驗證。但是,此處有個問題,怎麼確定對方的公鑰是安全的,就是他們需要發送對方的呢?是以有了第三方公證機構(CA:證書頒發機構)

    公鑰加密常用算法:

        DSA:隻能用于實作數字簽名,不能實作加密解密

        RSA:既能實作數字簽名又能實作加密、解密。 

6.2.3、單向加密:隻能實作加密,不能實作解密,用于提取資料指紋

    單向加密特征:

        定長輸出、雪崩效應

    單向加密功能:

        用于實作完整性

    單向加密算法:

        md5:messagedigest,消息摘要,5是版本号,128bits定長輸出

        sha1:secure hash algorithm,1是版本号,160bits定長輸出

        sha224、sha256、sha384、sha512

    注意:對于centos6、7來說,密碼加密已從centos5中的md5切換到sha512了。

6.2.4、認證協定:和加密算法相關的協定,密鑰交換,IKE(internet key exchange)

    密鑰交換:IKE

        公鑰加密:密鑰在網上傳輸

        DH(diffie-hellman):密鑰不在網上傳輸,更安全些

6.3、PKI:pulic keyinfrastructure;公鑰基礎設施

      元件如下:

        簽證機構:CA

        注冊機構:RA

        證書吊銷清單:CRL

        證書存取庫:CB

證書:數字證書标準(x.509),它定義了證書的結構以及認證協定标準

  證書組成部分:

    ①版本号

    ②序列号

    ③簽名算法ID

    ④發行者名稱

    ⑤有效期限

    ⑥主體名稱

    ⑦主體公鑰

    ⑧發行者的唯一辨別

    ⑨主體的唯一辨別

    ⑩拓展資訊

    11.發行者的簽名

 其中①-⑤為簽證機構資訊,⑥-⑩為個人資訊,11為發證機構

7、SSL和TLS協定:

ssl:secure socket layer,安全套接字層在ip層和傳輸層之間銜接,有網警公司開發

    ssl v1.0(已廢棄)、ssl v2.0(已廢棄)、ssl v3.0

tls:transport layer security,傳輸層協定安全,由ITEF研發

    tls v1.0 、tls v1.1 、tls v1.2 、tls v1.3(草案)   

tls分層設計:

    最底層:基礎算法原語的實作,aes,rsa,MD5

    向上一層:各種算法的實作

    再向上一層:組合算法實作的半層品

    最頂層:用各種元件拼裝而成的各種成品密碼學協定軟體。

注意:實作ssl協定和tls協定的軟體的有很多,著名的開源軟體有:openssl。

8、openssl元件:

    libcrypto庫:實作加密解密,主要由開發者使用

    libssl庫:實作ssl功能,主要由開發者使用

    openssl:多用途的明林工具

9、ssl會話步驟:

    用戶端向服務端索要并驗證證書

    雙方協商生成“會話密鑰”

    雙方采用“會話密鑰”進行加密通信

  ssl會話流程:ssl handshank,有四個階段

    第一階段:client hello

        向伺服器端發送①、支援的協定版本,比如tls1.2;②、用戶端生成一個随機數,稍後使用者生成“會話密鑰”,③、支援的加密算法,比如rsa、aes,④、支援的壓縮算法

    第二階段:server hello  

        ①、确認使用的加密通信協定版本,比如tls1.2

        ②、伺服器端生成一個随機數,稍後用于生成“會話密鑰”

        ③、确認使用的加密算法

        ④、服務端發送自己的證書

        ⑤、索要用戶端證書(可省)

    第三階段:client端收到serverhello後的回應

        ①、驗證伺服器證書,(證書發放機構、證書完整性、證書持有者、證書有效性、吊銷清單等)

        ②、确認以上資訊無誤後,取出其公鑰

        ③、發送以下資訊給伺服器端:

            一個随機數:用于伺服器上的公鑰加密

            編碼變更通知:表示随後資訊都将用雙方協定的加密算法加密後發送

            用戶端握手結束通知

    第四階段:服務端收到用戶端發送來的資訊

        ①、收到用戶端發送來的第二個随機數,pre-master-key後,計算生成本次會話所用到的“會話密鑰”

        ②、向用戶端發送以下資訊:

            編碼變更通知:表示随後的資訊都将用雙方協定的加密方法和密鑰發送

            服務端握手結束通知

10、openssl指令:

  指令格式:openssl command [ command_opts ] [ command_args ]

    openssl指令有如下三類:

        标準指令

        消息摘要指令

        加密指令

[root@localhost httpd]# openssl ?

openssl:Error: '?' 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              

[root@localhost httpd]# 

10.1、openssl實作對稱加密:

 openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt]          [-z] [-md] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]    

    工具:openssl enc

    支援算法:3des、aes、blowfish、towfish

    加密示例:

        [root@localhost sh]# openssl enc -e -des3 -a -salt -in /etc/fstab -out /tmp/fstab.cipertext   //-in:要加密的檔案,-out:加密後的檔案,-e:加密

    解密示例:

       [root@localhost sh]# openssl enc -d -des3 -a -salt -in /tmp/fstab.cipertext -out /tmp/fstab.plain  //-d:解密

10.2、openssl實作單向加密:

 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...]

        [md5|md4|md2|sha1|sha|mdc2|ripemd160] [-c] [-d] [file...]

    工具:openssl dgst

    支援的算法:md5sum、sha1sum、sha224sum、...

      [root@localhost sh]# openssl dgst -md5   /etc/fstab

      MD5(/etc/fstab)= ec11d9db3a8d8a8dabfe0d98af76ac46

      [root@localhost sh]# md5sum /etc/fstab 

      ec11d9db3a8d8a8dabfe0d98af76ac46  /etc/fstab

      [root@localhost sh]# 

    生成使用者密碼工具:passwd、openssl passwd

        [root@localhost sh]# man sslpasswd    

        openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}   //salt:随機數

     示例:

        [root@localhost sh]# openssl passwd  -1 -salt 12345678   //-1:表示md5加密,salt表示随機數

        Password:    

        $1$12345678$KShFLCowWE89oV0dKisl2/

        [root@localhost sh]# 

        [root@localhost sh]# openssl passwd -1 -salt $(openssl rand -hex 5)

        Password: 

        $1$cccd731d$6j3DLRtJZqurDiprU/7oz0

    生成随機數:工具openssl rand

     檢視rand在哪些章節有幫助文檔

        [root@localhost sh]# whatis rand

        rand (3)             - pseudo-random number generator

        sslrand (1ssl)       - generate pseudo-random bytes

        rand (3p)            - pseudo-random number generator

    rand指令用法:openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num   //base64表示:用ASCII碼表示輸出的檔案(A-Z),-hex表示僅以16進制(1-F)表示資料

    示例:

        [root@localhost sh]# openssl rand  -base64 16

        QbOTMmR3cpp5+Y2eKIoN3g==

        [root@localhost sh]# openssl rand  -hex 16

        f41d01d6774f77029dd8ea46ca3214e8

10.3、openssl實作公鑰加密:

    公鑰加密的三種功能:

        加密、解密:(算法:rsa;工具:openssl rsautl)

        數字簽名:(算法:rsa、dsa,工具:rsautl)

        密鑰交換:(算法:D-H)

    生成密鑰步驟:注意:生成密鑰對于公鑰加密來說,公鑰不是生成的,是從私鑰中提取出來的 。

     ①、生成私鑰:

        [root@localhost sh]# (umask 077;openssl genrsa -out /a.key 50)  //指令放在括号中運作,表示在目前shell的子shell中運作,運作完則退出,避免對目前shell的影響;-out指出生成的密鑰存儲的位置,50:表示聲場密鑰的位長。

        Generating RSA private key, 50 bit long modulus

        .+++++++++++++++++++++++++++

        e is 65537 (0x10001)

        [root@localhost sh]# cat /a.key 

        -----BEGIN RSA PRIVATE KEY-----

        MDcCAQACBwNeIm8b7bkCAwEAAQIHAPfq8fZg4QIEAdutBQIEAc/8JQIEANpH6QID

        P5cZAgQAtovS

        -----END RSA PRIVATE KEY-----

    ②、生成公鑰:從私鑰中提取。

        [root@localhost sh]# openssl rsa -in /a.key -pubout     //-in:指定從哪個檔案提取公鑰,-pubout:提取并展示出

        writing RSA key

        -----BEGIN PUBLIC KEY-----

        MCIwDQYJKoZIhvcNAQEBBQADEQAwDgIHA14ibxvtuQIDAQAB

        -----END PUBLIC KEY-----

    ------------------------------------------------------------------------------------------------------    

     linux系統上随機數生成器:

        /dev/random:僅從熵池中傳回随機數,随機數用盡,程序阻塞

        /dev/urandom:從熵池中傳回随機數,随機數用盡,會利用軟體生成僞随機數,不阻塞程序。但是這中不安全。

        熵池中随機數來源:

            ①、硬碟I/0中斷時間間隔

            ②、鍵盤I/O中斷時間間隔      

10.4、CA建立

    CA有兩種類型:公共信任CA、私有CA。

    建立私有CA的方法:openssl指令、openca指令

    CA的配置檔案:[root@localhost sh]# cat /etc/pki/tls/openssl.cnf 

 建構私有CA步驟:

    ①、在确定配置為CA的伺服器上生成一個自簽證書 ②、并為CA提供所需要的目錄及檔案即可

 私有CA配置示例:

   ①、生成密鑰放在/etc/pki/CA/private/目錄下 ,檔案名必須為/etc/pki/tls/openssl.cnf中配置的名稱。       

    [root@localhost CA]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 40)

    [root@localhost CA]# ls /etc/pki/CA/private/ -l   //確定生成的密鑰檔案的權限為600

    total 4

    -rw-------. 1 root root 132 Feb  3 10:21 cakey.pem

    [root@localhost CA]# 

   ②、生成自簽證書(發送申請證書申請):按配置檔案要求配置(certificate = /etc/pki/CA/cacert.pem )

        req:證書請求及證書生成工具。

   [root@localhost private]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365

    Country Name (2 letter code) [XX]:cn

    State or Province Name (full name) []:beijing

    Locality Name (eg, city) [Default City]:beijing

    Organization Name (eg, company) [Default Company Ltd]:magedu

    Organizational Unit Name (eg, section) []:ops

    Common Name (eg, your name or your server's hostname) []:www2.stux.com  //此處要寫成用戶端通路的服務的主機資訊,

    Email Address []:

    指令解釋:

        -new:生成新證書簽署請求

        -x509:生成自簽格式證書,專用于建立私有CA時,此處如果不自簽,不需要加此項,但是自簽,必須要寫此項

        -key:生成請求時用到的私鑰檔案路徑

        -out:生成的請求檔案路徑;如果自簽操作将直接生成簽署過的證書

        -days:證書的有效時長,機關是days。

    ③、為ca提供所需要的目錄(certs 、crl、 newcerts)和檔案(serial、index.txt),如果這幾個個檔案不存在 則需要手工建立

    [root@localhost CA]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}

    [root@localhost CA]# touch  /etc/pki/CA/{serial,index.txt}    //serial:證書序列号,index.txt:證書資料庫   

    [root@localhost CA]# echo 01 > /etc/pki/CA/serial   //寫入一個證書序列号。

 至此,私有ca建立完成。

要用到證書進行安全通信的伺服器,需要向CA請求簽署證書,比如https伺服器,步驟如下:

    ①、用到證書的伺服器主機生成私鑰(以https主機為例)

    [root@localhost CA]# mkdir /etc/httpd/ssl 

    [root@localhost CA]# cd /etc/httpd/ssl

    [root@localhost ssl]# (umask 077;openssl genrsa -out httpd.key 2048)

    ②、用到證書的伺服器主機生成證書簽署請求:(因為不是自簽,是以不用加-x509)

    [root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr -days 365 

    ③、将請求通過可靠方式發送給ca主機,在CA主機上進行簽署。由于是在同一台主機上,是以,直接簽署。

    [root@localhost ssl]# openssl ca -in httpd.csr -out /etc/pki/CA/httpd.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: Feb 7 23:22:12 2018 GMT

                Not After : Feb 7 23:22:12 2019 GMT

            Subject:

                countryName = cn

                stateOrProvinceName = beijing

                organizationName = magedu

                organizationalUnitName = ops

                commonName = www.magedu.com

            X509v3 extensions:

                X509v3 Basic Constraints:

                    CA:FALSE

                Netscape Comment:

                    OpenSSL Generated Certificate

                X509v3 Subject Key Identifier:

                    93:33:80:F7:C5:12:6E:2A:22:92:E4:0C:70:56:00:D5:C4:76:6E:70

                X509v3 Authority Key Identifier:

                    keyid:77:55:41:C6:1D:5E:77:43:F8:9E:C0:2E:67:75:87:F4:2F:FE:0E:CC

    Certificate is to be certified until Feb 7 23:22:12 2019 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

    [root@localhost ssl]#

    ④、檢視證書資訊:(可以在ca和客戶機上檢視,隻要有ca的主機都可以檢視)

    [root@localhost ssl]# cat /etc/pki/CA/index.txt

    V 190207232212Z 01 unknown /C=cn/ST=beijing/O=magedu/OU=ops/CN=www.magedu.com

  或 [root@localhost CA]# openssl x509 -in httpd.crt -noout -serial -subject

    serial=01

    subject= /C=cn/ST=beijing/O=magedu/OU=ops/CN=www.magedu.com

    [root@localhost CA]#

    ⑤、将CA簽署過的證書發送給請求的伺服器。由于是本機簽署,是以不發送,拷貝簽署的證書到指定位置。注意:此時的httpd.csr(請求簽署檔案)可以删除了

    [root@localhost CA]# cp /etc/pki/CA/httpd.crt  /etc/httpd/ssl/    

10.5、吊銷證書:一般私有ca搭建,不用吊銷,如果要吊銷,一般會用openca工具實作。

    ①、用戶端擷取要吊銷證書的serial(序列号),(在使用證書的主機上執行)

    [root@localhost ssl]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject

    ②、CA端主機吊銷證書

    先根據客戶送出的serial和subject資訊,對比與本機資料庫index.txt中存儲的是否一緻。

    [root@localhost ssl]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem

    Revoking Certificate 01.

    ③、生成吊銷證書編号(第一次吊銷證書時執行)

    [root@localhost ssl]# echo 01 > /etc/pki/CA/crlnumber

    ④、更新證書吊銷清單

    [root@localhost CA]# openssl ca -gencrl -out thisca.crl