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协议的文本数据进行加密处理后,成为二进制形式传输

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

  • 相关阅读:
    【leetcode】1365. How Many Numbers Are Smaller Than the Current Number
    【leetcode】1363. Largest Multiple of Three
    【leetcode】1362. Closest Divisors
    【leetcode】1361. Validate Binary Tree Nodes
    【leetcode】1360. Number of Days Between Two Dates
    【leetcode】1359. Count All Valid Pickup and Delivery Options
    【leetcode】1357. Apply Discount Every n Orders
    【leetcode】1356. Sort Integers by The Number of 1 Bits
    ISE应用入门的一些问题
    DDR的型号问题
  • 原文地址:https://www.cnblogs.com/liangjindong/p/9063973.html
Copyright © 2011-2022 走看看