zoukankan      html  css  js  c++  java
  • 网络安全加解密原理

    网络安全背景

    ​        网络就是实现不同主机之间的通讯。网络出现之初利用TCP/IP协议簇的相关协议概念,已经满足了互连两台主机之间可以进行通讯的目的,虽然看似简简单单几句话,就描述了网络概念与网络出现的目的,但是为了真正实现两台主机之间的稳定可靠通讯,其实是一件非常困难的事情了,如果还要再通讯的基础上保证数据传输的安全性,可想而知,绝对是难上加难,因此,网络发明之初,并没有太关注TCP/IP互联协议中的安全问题。

    ​        对于默认的两台主机而言,早期传输数据信息并没有通过加密方式传输数据,设备两端传输的数据本身实际是明文的,只要能截取到传输的数据包,就可以直接看到传输的数据信息,所以根本没有安全性可言。

    早期利用明文方式传输的协议有:FTP、HTTP、SMTP、Telnet等。

    数据加密算法

    网络安全涉及很多方面,而网络数据的安全传输通常会面临以下几方面的威胁:

      1.数据窃听与机密性: 即怎样保证数据不会因为被截获或窃听而暴露。

      2.数据篡改与完整性: 即怎样保证数据不会被恶意篡改。

      3.身份冒充与身份验证: 即怎样保证数据交互双方的身份没有被冒充。

    针对以上几个问题,可以用以下几种数据加密方式来解决(每种数据加密方式又有多种不同的算法实现):

    数据加密方式 描述 主要解决的问题 常用算法
    对称加密 指数据加密和解密使用相同的密钥 数据的机密性 DES,AES
    非对称加密 也叫公钥加密,指数据加密和解密使用不同的密钥-密钥对 身份验证 DSA,RSA
    单向加密 指只能加密数据,而不能解密数据 数据的完整性 MD5,SHA系列算法

    普通算法

    网站此时利用普通常见算法,针对密码加密,基本保证数据再传输时候,不是明文
    但是黑客可能会有一个庞大的算法本,里面记录了常见的密码和加密后的密文,一一对应,然后可以利用程序大量计算,反解出明文密码
    
    撞库是黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。 很多用户在不同网站使用的是相同的帐号密码,因此黑客可以通过获取用户在A网站的账户从而尝试登录B网址,这就可以理解为撞库攻击。
    

      

    对称加密 

     

    对称加密算法,如其名,就是使用同一个秘钥进行加密和解密。
    
    优点是速度较快,适合对数据量比较大的数据进行加密。
    
    缺点是密钥的保存方式需要保证,一旦加密或者解密的哪一方泄漏了密钥,都会导致信息的泄漏。
    
    常用的对称加密算法有:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6、AES。
    

      

    非对称加密

    简单理解,比喻关系
    公钥---锁
    私钥---开锁钥匙
    
    私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
    比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
    

      

    常用的非对称假面算法有:RSA,ECC,Diffie-Hellman,El Gamal,DSA(数字签名用)

    虽然非对称加密很安全,但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。为了解释这个过程,请看下面的例子:
    1.使用对称加密,速度快
    2.使用非对称加密的方式,针对第一步的秘钥加密传输
    
    
    (1) 超哥需要在银行的网站做一笔交易,他的浏览器首先生成了一个随机数作为对称密钥。
    
    (2) 超哥的浏览器向银行的网站请求公钥(非对称加密的公钥~~)。
    
    (3) 银行将公钥发送给超哥。
    
    (4) 超哥的浏览器使用银行的公钥将自己的对称密钥加密(这里是重点,已经是【对称加密+非对称加密】)。
    
    (5) 超哥的浏览器将加密后的对称密钥发送给银行。
    
    (6) 银行使用私钥解密得到超哥浏览器的对称密钥。
    
    (7) 超哥与银行可以使用对称密钥来对沟通的内容进行加密与解密了。
    

     总结

    1.对称加密方式,加密解密使用同样的密钥,速度较快,但是密钥需要在网络中传输,因此可能被截获,不安全
    
    2.非对称加密,使用一对密钥,公钥,私钥,因此安全性很高,但是加密和解密速度很慢
    
    3.常用的方式是,结合两种加密方式,效率与安全性都有又了保障。
    

      

    如何安全获取公钥

     1) A和B端首先生成自己的公钥和私钥的密钥对,为了使对方能相信自己的公钥信息,将自己的公钥信息告知给第三方发证机构,利用第三方机构对自己的公钥进行公证。第三方机构会制作一个数字证书(机构 编号 以及发证机构的戳),并且第三方机构也要给自己设置一个合法的公钥和私钥,并且公钥设置为第三方机构的公钥证书。

    2) 发证机关计算出数字证书数据的特征码,并用自己的私钥进行加密,并将加密的信息附加到特征码后成为数字签名。

    3) A和B两端获得公正过的证书信息,并通过证书信息传递,得到对方的公钥。

    4) A和B两端与第三方机构建立连接,获得第三方证书,通过第三方证书获得第三方公钥,利用第三方公钥只要能解密数字签名即可。

    Openssl软件

    在传输层和应用层之间。ssl层

     

     openssl实践

    openssl由三部分组成:

      1.libcrpto:通用加密库

      2. libssl:TSL/SSL组成库,基于会话实现了身份认证,数据加密和会话完整性。

      3. openssl:提供命令行工具,例如模拟创建证书。

    openssl命令行

    # 检查版本
    [root@chaogelinux ~]# openssl version
    OpenSSL 1.0.2k-fips  26 Jan 2017
    
    # 配置文件
    [root@chaogelinux ~]# cat /etc/pki/tls/openssl.cnf
    
    #获取openssl命令操作
    [root@chaogelinux ~]# openssl -?
    openssl:Error: '-?' is an invalid command.
    
    # 标准命令
    Standard commands
    asn1parse         ca                ciphers           cms
    crl               crl2pkcs7         dgst              dh
    dhparam           dsa               dsaparam          ec
    ...
    
    # 信息摘要命令,单向加密命令
    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
    
    # 测试机器对openssl支持的加密算法进行速度测试,检测服务器性能
    openssl speed
    

      

    【openssl加密命令】

    语法
    openssl enc -加密算法  -in filename -out filename  
    
    # 对文件加密
    
    [root@chaogelinux ~]# cat my.pwd
    yu:123
    [root@chaogelinux ~]#
    [root@chaogelinux ~]#
    # 输入密码后加密成功,超哥这里是888888
    [root@chaogelinux ~]# openssl enc -des3 -salt -a -in my.pwd -out my.pwd.des3
    enter des-ede3-cbc encryption password:
    Verifying - enter des-ede3-cbc encryption password:
    
    #解密文件
    [root@chaogelinux ~]# cat my.pwd.des3
    U2FsdGVkX19ZDOFtbdZz3QNu+bxm3DKd
    [root@chaogelinux ~]#
    
    # 输入密码后,解密文件
    [root@chaogelinux ~]# openssl enc -des3 -d -salt -a -in my.pwd.des3 -out my.pwd.src
    enter des-ede3-cbc decryption password:
    [root@chaogelinux ~]#
    [root@chaogelinux ~]# cat my.pwd.src
    yu:123
    
    参数解释:
    enc openssl把众多的对称加密算法,统一集成在了enc指令,用法是 enc -算法名
    -des3 指定算法
    -d    指定解密
    -e  指定加密
    -salt 密码加盐,防止密码被破解
    -a 基于base64位编码,可选参数
    

    【openssl创建私有证书】

    1.创建私钥和公钥,模拟证书颁发机构生成证书,生成一对密钥

    # 指定私钥长度1024,并且将生成的私钥信息保存在文件里,且利用小括号功能,修改子shell的umask
    [root@chaogelinux ssl_cert]# (umask 077;openssl genrsa -out server1024.key 1024)
    Generating RSA private key, 1024 bit long modulus
    ..........++++++
    ...................++++++
    e is 65537 (0x10001)
    
    # 读取私钥文件,选择非对称加密算法rsa,生成公钥,写入到文件中
    [root@chaogelinux ssl_cert]# openssl rsa -in server1024.key -pubout -out server1024.key.pub
    
    # 检查文件
    [root@chaogelinux ssl_cert]# ls
    server1024.key  server1024.key.pub
    
    
    # 生成自签的证书
    [root@chaogelinux ssl_cert]# openssl req -new -x509 -key server1024.key -out server.crt -days 365
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:BJ
    Locality Name (eg, city) [Default City]:BJ
    Organization Name (eg, company) [Default Company Ltd]:chaoge
    Organizational Unit Name (eg, section) []:it
    Common Name (eg, your name or your server's hostname) []:pythonav.cn
    

      

    Nginx部署https

    ​        利用证书实现HTTPS访问Nginx服务,需要nginx使用ssl模块配置HTTPS支持,默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,这些文件并不在同一个软件包中,通常这个文件名类似libssl-dev。 

    ​        nginx的https协议需要ssl模块的支持,我们在编译nginx时使用--with-http_ssl_module参数加入SSL模块。还需要服务器私钥,服务器证书,如果是公司对外环境,这个证书需要购买第三方的权威证书,否则用户体验得不到保障

    部署https实践

    1.创建Nginx需要的证书文件
    确保机器安装了openssl和openssl-devel,创建证书
    yum install openssl openssl-devel -y 
    
    2.确保nginx支持了ssl模块,查看nginx编译信息即可
    nginx -V
    
    3.模拟证书颁发机构CA创建证书
    进入nginx安装目录,便于管理证书
    [root@chaogelinux ~]# cd /opt/ngx112/
    [root@chaogelinux ngx112]# mkdir key
    [root@chaogelinux ngx112]# cd key/
    
    # 生成私钥文件,利用字shell降低文件权限
    [root@chaogelinux key]# (umask 077;openssl genrsa -out server1024.key 1024)
    Generating RSA private key, 1024 bit long modulus
    .++++++
    ...++++++
    e is 65537 (0x10001)
    
    
    # 自己签发证书,crt证书扩展名
    [root@chaogelinux key]# openssl req -new -x509 -key server1024.key -out server.crt -days 365
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:BJ
    Locality Name (eg, city) [Default City]:BJ
    Organization Name (eg, company) [Default Company Ltd]:chaoge
    Organizational Unit Name (eg, section) []:it
    Common Name (eg, your name or your server's hostname) []:pythonav.cn
    Email Address []:yc_uuu@163.com
    
    # 向机构申请证书,我们这里生成的是证书请求文件,而不是直接生成证书了,运维发送该文件给机构,请求合法证书
    [root@chaogelinux key]# openssl req -new -key server1024.key -out server.csr
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:BJ
    Locality Name (eg, city) [Default City]:BJ
    Organization Name (eg, company) [Default Company Ltd]:chaoge
    Organizational Unit Name (eg, section) []:it
    Common Name (eg, your name or your server's hostname) []:pythonav.cn
    Email Address []:yc_uuu@163.com
    
    # 针对这个请求文件,做一个加密处理,告知办法机构,可以用这个密码解密,了解公司信息,也可以直接回车不写密码
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    
    
    # 一般这个证书颁发,需要等到一周内的时间,因此我们直接使用本地的自己签发的证书即可,进行练习
    
    4.配置Nginx,加载私钥,证书
    修改nginx.conf,添加
    include extra/443.conf;
    
    # 创建https配置文件
    vim 443.conf 写入
    
    [root@web01 extra]# cat 443.conf
    
    server {
            server_name _;
            listen 443 ssl;
            ssl_certificate /opt/nginx/key/server.crt;
            ssl_certificate_key /opt/nginx/key/server1024.key;
            charset utf-8;
        location / {
    
             root html;
             index index.html index.htm;
    }
    }
    ~
    
    
    # 修改80端口虚拟主机,进行请求转发给443
    }
    server {
        listen 80;
        server_name www.chaoge.com;
        charset utf-8;
         rewrite ^(.*)$ https://$host$1 permanent;
        location / {
                root html;
                index index.html index.htm;
        }
        }
    include extra/443.conf;
    }
    
    
    # 检测语法,重启nginx
    [root@web01 extra]# nginx -t
    nginx: the configuration file /opt/nginx-1.16.0//conf/nginx.conf syntax is ok
    nginx: configuration file /opt/nginx-1.16.0//conf/nginx.conf test is successful
    

      

     使用腾讯云获取证书

    https://pythonav.com/wiki/detail/3/40/

  • 相关阅读:
    ural(Timus) 1019 Line Painting
    ACMICPC Live Archive 2031 Dance Dance Revolution
    poj 3321 Apple Tree
    其他OJ 树型DP 选课
    poj 3548 Restoring the digits
    ACMICPC Live Archive 3031 Cable TV Network
    递归循环获取指定节点下面的所有子节点
    手动触发asp.net页面验证控件事件
    子级Repeater获取父级Repeater绑定项的值
    没有列名的数据绑定
  • 原文地址:https://www.cnblogs.com/abc1234567/p/14224728.html
Copyright © 2011-2022 走看看