zoukankan      html  css  js  c++  java
  • 加密与安全

    本章主要描述加密算法的由来,特点以及在实践中的应用。

    一、背景

    TCP/IP协议诞生之初是为局域网服务的,安全方面的考虑不是重点,所以很多的协议如ftp,http,smtp,telnet都是明文的协议,通过抓包分析软件很容易得到用户的密码口令。

    二、加密

    一般来说,从三个方面来考虑数据的安全传输:机密性,完整性以及身份验证。

    1.机密性

           从发送方言就是将明文数据根据某种转换规则转换为密文,接收方再根据这种转换规则把密文转换为明文,这种转换规则就是加密算法,在算法中,密钥是关键,因为一种通用的加密算法更换难度是非常大的,而更换密钥就相对容易。

           从保护数据机密性的角度来说,有对称加密算法和非对称加密算法两种。

    1.1 对称加密算法特点

    • 加密和解密使用同一个密钥,效率高
    • 将原始数据分割成固定大小的块,逐个进行加密
    • 常见的有DES,3DES,AES等
    • 缺点是密钥过多,数据来源无法确认

    1.2 非对称加密算法特点

    • 密钥是成对出现的,公钥:公开给所有的人;私钥:自已留存,必须保证其秘密性
    • 用公钥加密的数据只能使用与之配对的私钥解密;反之亦然
    • 缺点:密钥长,加密解密效率低下
    • 功能:数字签名:主要在于让接收方确认发送方身份;对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
    • 常见的有RSA,DSA等

    2. 完整性

          通过单向散列算法(又称hash算法)将任意数据缩小成固定大小的指纹

    • 任意长度输入
    • 固定长度输出
    • 若修改数据,指纹也会改变
    • 无法从指纹中重新生成数据
    • 常见算式:md5,sha1,sha224, sha256,sha384,sha512

    3. 身份验证

     
        非对称算法的私钥可以用来作为身份验证,如图所示:
        传送者A:
    • 通过单向散列算法提取128bit的数字摘要(指纹)
    • 用自已的私钥对数字摘要加密(数字签名)
    • 用接收都B的公钥对数字摘要和原文加密(通常对对称的加密算法,因为加密和解密的效率高)
    • 发送给B

    接收者B:

    • B用自己的私钥对密文解密
    • 用A的公钥把数字签名解密(如果用A的公钥无法解密数字签名,则说明数字签名已经经过第三方的篡改,B会丢弃所收到的数据)
    • 同时B用单向散列算法对原文进行128bit的数字摘要提取
    • 并且和用A的公钥解密后的数字签名作比对,如果一致,则证明数据的完整性,如果不一致,则说明数据有人篡改

         但是A和B如何能安全的收到对方的公钥,必须借助于第三方的工具如证书来解决。

    三、CA和证书

    1. 简介

          证书的本质上利用第三方的可信任机构颁发的证书来传输公钥。

    如图所示,A和B分别获取对方公钥的流程:

    1. A向上级CA颁发机构申请证书,CA颁发机构分成各种不同的层级,无论如何,最后总是会追溯到根证书的颁发机构ROOTCA
    2. A在申请证书的过程中,需要提供自已的公钥
    3. 各级CA颁发机构分别用自己的私钥对A的公钥进行签名
    4. A得到的证书文件包含各CA颁发机构的公钥
    5. B重复同样的流程
    6. A、B在应用程序通信之前,已经内置了包含了各CA颁发机构公钥的证书
    7. 最终A、B通过这个证书链得到对方的公钥

    CA和证书生成、管理、颁发、使用,存储,吊销是有PKI(PKI Key Infrsatrcture)来定义这一体系中的各种角色,策略,流程等,同时,证书遵循x.509协议标准,定义了定义了证书的结构以及认证协议标准,主要包括的内容有:

    1. 版本号
    2. 序列号
    3. 签名算法
    4. 颁发者
    5. 有效期限
    6. 主体名称

    证书的类型有:

    1. 证书授权机构的证书
    2. 服务器证书
    3. 用户证书

    获取证书的两种方法

    1. 使用证书授权机构(是一种商业行为,根据证书的不同等级费用不一),主要步骤有:生成签名请求(csr);将csr发送给CA;从CA处接收签名
    2. 自签名证书:顾名思义用自己的私钥签发自已的公钥,是免费的,可以用在公司内部一些安全级别要求较高的应用服务上

    2. 用openssl来生成自签名证书的步骤

    向CA申请证书书:

    1. 建立Root CA

    1)生成私钥

    cd /etc/pki/CA/

    (umask 077;openssl genrsa -out private/cakey.pem 4096)

    2) 自签名证书

    openssl req -new -x509 -key private/cakey.pem  -out cacert.pem -days 3650(参数-x509表示自签名,不带此参数代表申请证书)

    openssl x509 -in cacert.pem -noout -text(以text方式查看证书)

    2. 用户或服务器

    1) 生成私钥

    (umask 077;openssl genrsa -out app.key 1024)

    2) 生成证书申请文件

    openssl req -new -key app.key -out app.csr

    3) 将申请文件发给CA

    scp app.csr root@192.168.56.101:/etc/pki/CA

    3. CA颁发证书

    touch index.txt

    echo 0F > serial

    openssl ca -in app.csr -out certs/app.crt -days 100

    /etc/pki/tls/openssl.cnf(可以修改此文件中的policy)

    4. 证书发送给客户端

      把生成的证书发给客户端app.crt

    3. openssl用法:

    openssl paswd -1(生成以md5加密的密码)

    openssl rand -hex 3(3代表字符,一个字符占8位,每一位16进制占4bit,所以输出是6个16进制的字符)

    openssl rand -base64 3(3代表字符,一个字符占8位,base64每一个字符占6bit,所以输出为4个base64编码的字符,如果无法整除,如4个字符,则用=补齐) 

    (umask 066;openssl genrsa -out private.key -des 1024) 生成带口令的私钥

    openssl rsa -in private.key -out private.key2(输出一个不带口令的私钥)

    openssl rsa -in private.key -pubout -out public.key(从私钥中生成公钥)

    四、SSL/TLS安全协议

    如上图所示SSL/TSL工作于传输层之上,主要功能实现数据传输的机密性,认证,完整性,重放保护等。

    此协议分为握手阶段和应用阶段:

    • 握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成
    • 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信

    结全TCP/IP的三次握手过程,在完成三次握手之后,还需要根据上述流程完成SSL协议的通信。基中:

    • Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
    • ChangeCipherSpec 协议:一条消息表明握手协议已经完成
    • Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
    • Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等

    其中,常用的HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输

    总之,在加密与安全方面,用户私钥的管理是至关重要的,通常我们用加密码的方式对私钥进行加密,这样,即使第三方能获取到私钥,也会为因为没有密码导致没法获取私钥的明文,大大增加了系统的安全性。

  • 相关阅读:
    css固定底部的四种方法 CSS经典布局-Sticky footer布局
    Vue 中引入jquery
    js在ios中碰到的问题
    解决jq.autocomplete.js插件在三级联动中由于异步请求表单验证卡顿出错问题
    解决vue项目在ie中打开显示空白问题
    vue访问外部链接会拼接默认路径的问题
    jquery.autocomplete联想补全插件及使用中遇到的问题
    360浏览器记住密码状态表单自动填充问题
    JavaScript引入百度地图标注点与坐标偏移问题
    vue项目中开启Eslint碰到的一些问题及其规范
  • 原文地址:https://www.cnblogs.com/liangjindong/p/9063973.html
Copyright © 2011-2022 走看看