zoukankan      html  css  js  c++  java
  • 签名、加密、证书的基本原理和理解

    来源:https://zhuanlan.zhihu.com/p/59999022

    最近做一个项目涉及到RSA加密解密,看了很多文章大概总结了一下,加密解密的原理和常见的一些加密算法。

    1.摘要算法

    常用的摘要算法有MD5,SHA1。摘要算法是一个不可逆过程,就是无论多大数据,经过算法运算后都是生成固定长度的数据,一般结果使用16进制进行显示。

    MD5和SHA1的区别:MD5结果是128位摘要,SHa1是160位摘要。那么MD5的速度更快,而SHA1的强度更高。

    下面统一使用MD5算法进行说明,SHA1类似。

    主要用途有:验证消息完整性,安全访问认证,数据签名。

    消息完整性:由于每一份数据生成的MD5值不一样,因此发送数据时可以将数据和其MD5值一起发送,然后就可以用MD5验证数据是否丢失、修改。在下文中对数据内容的完整性就是通过比较发送内容的MD5和接收到的内容的MD5是否一样判断其完整性。

    安全访问认证:这是使用了算法的不可逆性质,(就是无法从MD5值中恢复原数据)对账号登陆的密码进行MD5运算然后保存,这样可以保证除了用户之外,即使数据库管理人员都无法得知用户的密码。

    数字签名:这是结合非对称加密算法和CA证书的一种使用场景。

    一般破解方法:字典法,就是将常用密码生成MD5值字典,然后反向查找达到破解目的,因此建议使用强密码

    2.对称加密算法

    对称加密算法只是为了区分非对称加密算法。其中鲜明的特点是对称加密是加密解密使用相同的密钥,而非对称加密加密和解密时使用的密钥不一样。对于大部分情况我们都使用对称加密,而对称加密的密钥交换时使用非对称加密,这有效保护密钥的安全。非对称加密加密和解密密钥不同,那么它的安全性是无疑最高的,但是它加密解密的速度很慢,不适合对大数据加密。而对称加密加密速度快,因此混合使用最好。

    常用的对称加密算法有:AES和DES.

    DES:比较老的算法,一共有三个参数入口(原文,密钥,加密模式)。而3DES只是DES的一种模式,是以DES为基础更安全的变形,对数据进行了三次加密,也是被指定为AES的过渡算法。

    AES:高级加密标准,新一代标准,加密速度更快,安全性更高(不用说优先选择

    3.非对称加密(RSA)

    这里主要对RSA进行介绍。

    对称加密加密解密使用的是相同的密钥,而非对称加密加密解密时使用的不同的密钥,分为公钥(public key)和私钥(private key).公钥可以公开,而私钥自己保存。它利用的是两个大质数相乘十分容易,而对其乘积进行因素分解十分困难。这样就可以将乘积作为密钥了,这个乘积为N值,根据两个大质数选择e和生成d,删掉两个大质数。这样(N,e)为公钥,(N,d)为私钥,公钥无法破解出私钥(不作详细介绍,我们不是研究算法的)。由于非对称加密的密钥生成麻烦,所以无法做到一次一密,而且其加密速度很慢,无法对大量数据加密。因此最常用的使用场景就是数字签名和密码传输,用作数字签名时使用私钥加密,公钥解密;用作加密解密时,使用公钥加密,私钥解密。

    下面这篇文章对这三个算法都做了详细的介绍,想要深入了解的可以看看:


    数据传输安全的要满足的要求:

    1. 消息的发送方能够确定消息只有预期的接收方可以解密(不保证第三方无法获得,但保证第三方无法解密)。
    2. 消息的接收方可以确定消息是由谁发送的(消息的接收方可以确定消息的发送方)。
    3. 消息的接收方可以确定消息在途中没有被篡改过(必须确认消息的完整性)。

    对称加密
    网络的数据传输从发送方发出到接收方接收到,要经过数个节点才能到达目的地,在这个过程中难免会被别有用心的人监听(现在常用的网络数据监听软件就有charles,具体可以查看相关使用教程,通过这个软件可以监听到某个页面用到了哪些接口,发送以及返回的参数分别是什么)。所以在传输敏感数据的过程中,就要对数据进行加密。现行的加密过程中,一般加密算法是公开的,密钥是自己持有,发送方有密钥对数据进行加密传输,在传输的过程中经过加密的数据即使被第三方窃取到也因为没有密钥不能解密。而接收方同样持有密钥通过算法的逆运算把密文解析出对应的明文来。
    过程如下:


    上述算法即为对称加密,特点是加密和解密都是用同一个密钥。这种算法的前提条件是发送方和接收方用一个密钥,也就是说在数据传输之前,接收方要知道发送方用于发送加密数据所用到的密钥。但是现实条件是一般不会把密钥手把手的交给对方,所以下面就要用到非对称加密算法。
    非对称加密算法
    非对称加密算法中信息的发送方和接收方都分别有两个密钥,其中分别为私钥和公钥,私钥为数据的发送方持有,公钥可以公开。其中涉及到两种模式,它们分别为加密模式和认证模式。
    加密模式:
    发送方用公钥给数据进行加密,然后把加密后的数据发送到接收方,然后接收方用对应的私钥解密,因为只有接收方的私钥才能解析数据,所以即使被第三方窃取到数据也没有关系。这个模式叫做加密模式。在这个过程中如何保证数据的完整性,保证数据是发送方发送的数据,而不是被第三方篡改后的数据。这时就要用到签名,在发送方加密明文之前,给明文取md5值,得到其信息的摘要(注:不能通过信息摘要反推明文)。然后用公钥分别给明文和明文的摘要加密发送到数据的接收方,数据的接收方接收到数据之后,用私钥对密文和摘要进行解密,然后对解密得到的明文取md5摘要,比对解密后的明文摘要和发送过来的摘要是否一致;一致就证明数据是原始的数据没有遭到篡改。这个加密的过程中保证了数据的安全性(即只有接收方才可以解密)和防篡改性(签名认证),这就保证了上面说的数据传输要求中的第一点和第三点。下面是图解过程:


    但是因为公钥是公开的,所以在加密模式中我们是不知道到底是谁发送数据给我们的,因此下面就要提到认证模式。
    认证模式:
    在认证模式中,发送方用私钥加密数据,给接收方发送数据,接收方用公钥解密,因为私钥是唯一的,所以只要数据解析成功就可以知道数据发送方是谁。
    这就附和我们在数据的传输要求中的第二点了。下面是图解过程:


    结合加密模式和认证模式就可以实现数据传输安全的三大要点了。
    下面我们来解释一下这种高级模式,以发送方和接收方两个部分来解释:

    1. 将消息进行散列运算,得到消息摘要。
    2. 使用自己的私钥对消息摘要加密(认证模式:确保了接收方能够确认自己)。
    3. 使用接收方的公钥对消息进行加密(加密模式:确保了消息只能由期望的接收方解密)。
    4. 发送消息和消息摘要。

    接下来我们看一下接收方所执行的步骤:

    1. 使用发送方的公钥对消息摘要进行解密(确认了消息是由谁发送的)。
    2. 使用自己的私钥对消息进行解密(安全地获得了实际应获得的信息)。
    3. 将消息进行散列运算,获得消息摘要。
    4. 将上一步获得的消息摘要 和 第一步解密的消息摘要进行对比(确认了消息是否被篡改)。

    可以看到,通过上面这种方式,使用了接收方、发送方全部的四个密钥,再配合使用消息摘要,使得前面提出的安全传递的所有三个条件全都满足了。那么是不是这种方法就是最好的呢?不是的,因为我们已经说过了,非对称加密是一种很耗时的操作,所以这个方案是很低效的。实际上,我们可以通过它来解决对称加密中的密钥传递问题,如果你已经忘记了可以翻到前面再看一看,也就是说,我们可以使用这里的高级实现方式来进行对称加密中密钥的传递,对于之后实际的数据传递,采用对称加密方式来完成,因为此时已经是安全的了。
    证书机制
    与数字签名相关的一个概念就是证书机制了,证书是用来做什么呢?在上面的各种模式中,我们一直使用了这样一个假设,就是接收方或者发送方所持有的、对方的公钥总是正确的(确实是对方公布的)。而实际上除非对方手把手将公钥交给我们,否则如果不采取措施,双方在网络中传递公钥时,一样有可能被篡改。那么怎样解决这个问题呢?这时就需要证书机制了:可以引入一个公正的第三方,当某一方想要发布公钥时,它将自身的身份信息及公钥提交给这个第三方,第三方对其身份进行证实,如果没有问题,则将其信息和公钥打包成为证书(Certificate)。而这个公正的第三方,就是常说的证书颁发机构(Certificate Authority)。当我们需要获取公钥时,只需要获得其证书,然后从中提取出公钥就可以了。

  • 相关阅读:
    Spring 框架Bean的初始化和销毁---方式:BeanPostProcessor后置处理器
    Spring 框架Bean的初始化和销毁 -- 方式:@PostConstruct注解和@PreDestroy注解
    Spring 框架Bean的初始化和销毁---方式:InitializingBean接口,DisposableBean接口
    Spring 框架Bean的初始化和销毁 ---方式: @Bean(initMethod = "init",destroyMethod = "destroy")
    消息队列入门理解
    springboot的定时任务使用(动态cron,缓存提速)
    【SpringBoot WEB 系列】RestTemplate 之自定义请求头
    【SpringBoot WEB系列】WebFlux静态资源配置与访问
    【SpringBoot WEB系列】静态资源配置与读取
    【SpringCloud 系列】Eureka 注册中心初体验
  • 原文地址:https://www.cnblogs.com/x-x-736880382/p/13139972.html
Copyright © 2011-2022 走看看