alin的学习之路:加密相关知识(加密和解密,常见加密算法,消息验证码HMAC,数字签名)

1. 加密和解密

1.1 加密的三要素

  • 原始数据

    • 加密操作: 明文 -> 密文
    • 解密操作: 密文 -> 明文
  • 算法

    • 加密算法
    • 解密算法
  • 密钥

    • 本质上就是一个定长的字符串
    • 不同的加密算法,对应的密钥长度也不同
    • 作用:参与到加密解密的过程中,使最终得到的密文更加安全,不容易被破解
      • 解密的时候需要有密钥的参与,才能还原原始数据
      • 密钥一般是不能告诉别人的,要保管好。(公钥除外)

1.2 常见的加密方式

  • 对称加密:

    • 对称加密使用一个密钥,加解密同时使用,所以这个密钥需要自己保管好,如果他人得知该密钥则无法保证数据的安全
    • 加密速度快,加密效率高(相对于非对称加密)
      • 主要原因:对称加密的密钥长度相对于非对称加密的密钥长度较短,密钥越短加密时间越短
      • 加密大文件大数据适用
    • 加密等级相对较低
      • 主要原因:对称加密的密钥长度相对于非对称加密的密钥长度较短,密钥越短加密强度越低
    • 密钥分发困难 – 不能直接传输(如果不加密直接传输会被他人窃取密钥)
      • 对称加密是在通信的两端同时需要持有该密钥
      • 密钥需要在一端生成,发送给另一端
  • 非对称加密:
    • 在加解密的时候,使用的是不同的密钥:一个是公钥,一个是私钥

      • 密钥的使用:

        • 公钥加密,私钥解密
        • 私钥解密,公钥加密
      • 密钥的特点:
        • 公钥:公共的密钥,可以发给任何人
        • 私钥:只有生成密钥的一端可以持有,其他人不能知晓,所以需要保管好私钥
    • 加密速度慢,加密效率低(相对于对称加密)
      • 适合加密少量的数据
    • 加密等级较高(相对于对称加密)
    • 非对称加密的密钥分发指的是公钥的分发,私钥需要保存好

2. 常见的加密算法

2.1 对称加密

  • DES/3DES

    • DES : 已经不安全了

      • 密钥长度:8字节
    • 3DES :3重DES,这种密钥安全性可以保证,但是效率偏低。
      • 密钥长度:24字节,在算法内部该密钥被均分为3份,每一个密钥都是8个字节,也就相当于是3个DES算法

        • 注意密钥的设计:24个字节中分为三个密钥,要求三个密钥不能相同,如果相同的话3DES就和DES相同,不安全。
      • 加密过程:
        • 第一次:加密,使用密钥A
        • 第二次:解密,使用密钥B (这一步解密其实是变相的一个加密)
        • 第三次:加密,使用密钥C
      • 解密过程:
        • 第一次:解密,使用密钥C
        • 第二次:加密,使用密钥B (这一步加密其实是变相的一个解密)
        • 第三次:解密,使用密钥A
  • AES

    • 加密强度大,加密效率高
    • 密钥长度:16字节,24字节,32字节
      • 密钥越长,加密强度越大,使用时间越长
  • Blowfish
  • RC2/RC4/RC5
  • IDEA
  • SKIPJACK

2.2 非对称加密

加密算法

  • RSA(数字签名和密钥交换)

    • 这种算法也是使用最广泛的一种非对称加密算法
  • ECC(椭圆曲线加密算法 - 数字签名)
  • Diffie-Hellman(DH, 密钥交换)
  • El Gamal(数字签名)
  • DSA(数字签名)

密钥分发过程

密钥交换又称为密钥分发,本质就是对数据进行加密,保证数据的私密性。

  • 因为加密的是秘钥(对称加密的秘钥) , 因此也称之为秘钥交换, 或者秘钥分发

非对称加密有一个密钥对, 哪个秘钥都是可以加密的, 为了保证数据的私密性应该使用哪个秘钥加密呢?

  • 必须使用公钥加密, 使用私钥解密

主要应用场景:对称加密的密钥的分发

  • 分发流程:
  • 场景:通信的两端 a 给 b 分发密钥
  1. 在a端生成非对称加密的密钥对:公钥和私钥,将公钥通过网络发送给b,私钥自己保管好。
  2. 在b端生成对称加密所使用的密钥(定长字符串),将该密钥通过公钥进行加密,生成密文
  3. 将该密文通过网络发送给a端,a端接收密文
  4. a端使用私钥对该密文进行解密,得到对称加密的密钥
  5. 此时a,b两端可以通过该对称加密的密钥进行数据的通信

如果ab两端互换,则流程中ab互换

2.3 哈希算法(单向散列函数)

哈希函数接收数据输入(任意大小的数据块), 对数据进行处理, 得到定长的二进制字符串输出。

(哈希函数接收的数据实际上是有上限的,因为上限非常大而认为没有上限。)

哈希函数处理数据得到的结果:

  • 指纹
  • 摘要
  • 哈希值
  • 散列值
  • 哈希算法的特点:
  1. 计算结果是不可逆的,也就是单向的解释。不能通过生成的哈希值推导原始数据。

  2. 不管原始数据有多大,得到的哈希值是定长的。

  3. 如果原始数据不同,那么得到的哈希值就是不同的,如果两个原始数据只有一个标志位的不同,那么得到的哈希值会是截然不同的。

    (哈希值类似,不代表原始值类似)

  4. 有很强的抗碰撞性

    碰撞性:不同的原始数据通过哈希函数得到了相同的哈希值。

  5. 哈希算法的效率高

  • 哈希的使用:
  1. 网盘的秒传功能

    当向文件服务器进行传输数据时,先将原始数据通过哈希函数转换成为哈希值,用这个哈希值去与网盘数据库中的数据进行比较,如果发现有相同的值,那么就不需要再向服务器发送,达到秒传的效果。

  2. 去网站下载软件,网站通常会提供一个哈希值

    当软件下载完毕时,将下载完毕的数据通过哈希函数生成一个哈希值,将这个哈希值与网站提供的哈希值进行对比,可以判断下载的数据是否被篡改了。

  3. linux登陆

    管理员有最高权限, 可以查看任何文件中的信息, 管理员可以查看其它用户的用户名和密码信息。实际上密码是加密过的, 管理员是看不到原始数据的, 通过哈希加密的。用户设置好密码, 将密码的哈希存储到密码文件中, 登录的时候将用户的输入的密码进行哈希计算
    如果计算的哈希文件中存储的密码的哈希, 密码正确, 运行登录, 否则不允许登陆。

  4. 图片的快速识别(只能识别是哪张图片, 不能识别图像里有什么)

    有100张固定的图片, 选择其中一张, 快速识别出这是哪一张
    计算图片的哈希值, 使用 map<hash, 描述>

  • 常见的哈希算法

    • md4/md5

      • 早期的哈希算法,强抗碰撞性已经被破解
      • 哈希值长度:16字节
    • sha1
      • 强抗碰撞性已经被破解
      • 哈希值长度:20字节
    • sha2(这是一个系列)
      • sha224 (224指的是哈希值224位)

        • 哈希值长度:28字节
      • sha256
        • 哈希值长度:32字节
      • sha384
        • 哈希值长度:48字节
      • sha512
        • 哈希值长度:64字节
    • sha3(这是一个系列)
      • sha3-224

        • 哈希值长度:28字节
      • sha3-256
        • 哈希值长度:32字节
      • sha3-384
        • 哈希值长度:48字节
      • sha3-512
        • 哈希值长度:64字节
  • 不同的哈希函对应的哈希值的长度:

    哈希算法 哈希值长度 (bit) 哈希值长度(byte)
    md4 / md5 128bit 16字节(byte)
    sha1 160bit 20字节(byte)
    sha224 224bit 28字节
    sha256 256bit 32字节
    sha384 384bit 48字节
    sha512 512bit 64字节

3. 消息验证码 HMAC (用作数据校验)

消息认证码的作用: 对数据进行校验, 检测数据有没有被篡改, 这是对哈希的典型应用

  • 校验数据使用的哈希的特性, 每个数据都有自己唯一的哈希值, 数据篡改, 哈希值就会随之变化

但是如果直接使用哈希值来判断的话,会有一些问题:

  • 如果数据的篡改仅仅篡改了数据内容,那么是可以使用哈希值来进行验证数据是否被篡改
  • 如果数据的篡改同时改变了数据内容和发送的哈希值,那么便无法正确验证

所以需要使用消息验证码 HMAC。

消息验证码:将发送数据的哈希值通过共享密钥进行加密,传输的是加密过的哈希值,因为只有对端持有共享密钥的情况下才可以进行解密,所以无法生成假的哈希值。

  • 原始数据 + 哈希值 + 密钥 = 消息验证码(加密的哈希值)
  • 消息验证码的特点

    • 用于校验数据有没有被篡改
    • 不能加密原始数据,仅加密哈希值
    • 通信两端必须持有相同的共享密钥
      • 这个共享密钥不能直接分发,也要通过非对称加密的方式进行分发
    • 通过消息认证码不能验证数据的所有者是谁(要确定数据所有者是谁,需要使用数字签名)

4. 数字签名(用作数据校验)

首先需要使用有签名功能的非对称加密算法:

  • 数字签名并不是为了加密, 为了进行数据校验

  • 数字签名的核心思想:

    • 使用私钥进行加密,得到的密文就是数字签名

      • 为什么要使用私钥进行签名? 私钥是谁的,就表名是谁签的名,可以验证数据的所有者。
      • 私钥只有一个人有, 而且是唯一的, 因此私钥加密的数据不能被伪造
      • 私钥加密数据并不是为了保证数据的私密性, 而是防止数据被伪造
    • 加密的对象:数据的哈希值,对哈希值进行加密可以提高效率
    • 校验的过程: 使用公钥解密, 然后做对比

      • 使用公钥对签名数据解密, 将解密数据和收到的原始数据进行比较

        • 相同: 校验成功
        • 不同: 校验失败

数字签名和签名校验的过程:

场景描述: 通信的两端: A, B, A给B发送数据, B端接收数据并对A发送的数据进行校验

数字签名的过程:

  1. 根据场景的描述, 需要A对数据进行签名, 签名的时候需要使用私钥
  2. A端产生非对称加密的密钥对:公钥和私钥,将公钥发给B
  3. A端将数据同过哈希函数产生哈希值 hashA
  4. 将 hashA 使用私钥进行加密,得到密文,这个密文就是数字签名
  5. A发送数据:原始数据+数字签名,B接受这些数据

签名校验的过程:

  1. B将接受的数据通过哈希函数产生哈希值 hashB
  2. 将收到的数字签名使用公钥进行解密,得到 hashA
  3. 将hashA与hashB进行判断
    • 如果相等:验证成功,数据没有被篡改
    • 如果不等:验证失败,数据被篡改了

alin的学习之路:加密相关知识(加密和解密,常见加密算法,消息验证码HMAC,数字签名)相关推荐

  1. alin的学习之路:面试题 计算机网络相关

    alin的学习之路:面试题 计算机网络相关 介绍下proactor和reactor reactor:同步IO proactor:异步IO Reactor框架中用户定义的操作是在实际操作之前调用的.比如 ...

  2. alin的学习之路:面试题 数据库相关

    alin的学习之路:面试题 数据库相关 如何提高查询速度? 使用索引 create index 索引名 on 表名(列名1,列名2,--); 数据库索引,事务,事务级别 使用索引可以提高查询效率 事务 ...

  3. alin的学习之路(数据库篇:五)(MySQL的相关语句及API的C语言实现)

    alin的学习之路(数据库篇:五)(MySQL的相关语句及API的C语言实现) 1. MySQL概述与登陆MySQL mysql 与 oracle 的区别 oracle 是一个数据库实例下有多个用户, ...

  4. alin的学习之路(Linux网络编程:十)(http协议,BS模型)

    alin的学习之路(Linux网络编程:十)(http协议,BS模型) 需求:使用B/S模型来访问主机中的文件(包括目录) 0. B/S 模型 注意事项 1. 浏览器请求ico ​ 准备一个favic ...

  5. alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组)

    alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组) 1. SQL语句 1.1 sql语言类型 sql是一门独立的 ...

  6. alin的学习之路:在Qt中使用Oracle数据库

    alin的学习之路:在Qt中使用Oracle数据库 1. 准备工作 在Qt中安装好Source插件,将其中的oci模块进行编译,注意要在oci.pro中指定数据块的动态库和头文件路径 需要在Qt项目文 ...

  7. alin的学习之路(Linux系统编程:五)(目录操作、进程相关概念)

    alin的学习之路(Linux系统编程:五)(目录操作.进程相关概念) 1. 目录操作 1. 查看工作目录 getcwd char *getcwd(char *buf, size_t size) 功能 ...

  8. alin的学习之路(Linux系统编程:一)(Linux基础命令)

    alin的学习之路(Linux系统编程:一)(Linux基础命令) 1.Linux学习准备 操作系统的作用 向上给用户提供简单的操作计算机硬件的方式 对下管理硬件 承上启下 程序运行在操作系统上,程序 ...

  9. alin的学习之路:共享内存

    alin的学习之路:共享内存 1. 概念 共享内存是进程间通信中效率最高的一种方式. 共享内存: 可以被多个进程同时使用的一块内核的内存 有血缘关系的进程 没有血缘关系的进程 这块内存不属于任何的进程 ...

最新文章

  1. 手把手实现火爆全网的视频特效 “蚂蚁呀嘿”,太魔性了
  2. 精通CSS+DIV基础总结(三)
  3. HDU1247Hat’s Words(字典树)
  4. SQL计算100以内的质数(可以把100换成任意的整数)
  5. HBuilder 打包流程
  6. 说说 C 语言中的变量与算术表达式
  7. 【Mac】sublime text3标题栏显示文件完整路径
  8. 老王的心路历程(二):下一站Web体验监控产品
  9. 常数时间插入、删除和获取随机元素
  10. Ubuntu18.04忘记密码解决
  11. 微信经典飞机大战素材
  12. UltraCompare如何进行模块和线路模式合并?
  13. jquery的图片播放插件 - colorbox
  14. 常见图片分类及适用场景
  15. 如果禅道忘记了管理员密码怎么拯救
  16. Windows7旗舰版SP1_32位2018.10(装机版)
  17. 解决谷歌浏览器无法输入中文的问题
  18. 训练数据出现TypeError: 'numpy.float64' object cannot be interpreted as an integer错误
  19. 7-20 设计一个People类 (20 分)
  20. 初学单片机:Proteus 8 和 keil 4的使用方法(Proteus 8 和 keil 4建立一个项目/文件)

热门文章

  1. linux网络通信命令-如何给其他用户发送消息发送全体消息
  2. 鱼跃Flash新年电子贺卡
  3. /var/log/pacct、/var/spool/mail/root日志文件过大,处理方案小结
  4. ERP系统有哪些优点和缺点?
  5. 【设计模式】策略模式(行为型)
  6. 树莓派各版本下载 (Ubuntu MATE 16.04)
  7. 黑帽seo 模板生成php,2020最新黑帽SEO技术中排名稳定方法,万能采集模板CMS
  8. h5页面中中关闭微信与支付宝窗口
  9. 服务器系统怎么在pe安装win7系统安装,ISO文件怎么安装win7系统
  10. centos7.2 kvm虚拟化管理平台WebVirtMgr部署