Bootstrap

【067期】面试官问:说说常见的加密算法、原理、优缺点及用途?

>>号外:关注“Java精选”公众号,回复“面试资料”,免费领取资料!“Java精选面试题”小程序,3000+ 道面试题在线刷,最新、最全 Java 面试题!

一、概述

在安全领域,利用密钥加密算法来对通信的过程进行加密是一种常见的安全手段。利用该手段能够保障数据安全通信的三个目标:

1、数据的保密性,防止用户的数据被窃取或泄露
2、保证数据的完整性,防止用户传输的数据被篡改
3、通信双方的身份确认,确保数据来源与合法的用户

而常见的密钥加密算法类型大体可以分为三类:对称加密、非对称加密、单向加密。下面我们来了解下相关的算法原理及其常见的算法。

二、对称加密

在加密传输中最初是采用对称密钥方式,也就是加密和解密都用相同的密钥。

对称加密过程如下:

1.对称加密算法采用单密钥加密,在通信过程中,数据发送方将原始数据分割成固定大小的块,经过密钥和加密算法逐个加密后,发送给接收方

2.接收方收到加密后的报文后,结合解密算法使用相同密钥解密组合后得出原始数据。

图示:

优点

是效率高,算法简单,系统开销小,适合加密大量数据。

缺点

安全性差

加解密算法是公开的,因此在这过程中,密钥的安全传递就成为了至关重要的事了。而密钥通常来说是通过双方协商,以物理的方式传递给对方,或者利用第三方平台传递给对方,一旦这过程出现了密钥泄露,不怀好意的人就能结合相应的算法拦截解密出其加密传输的内容。

扩展性差

每对通信用户之间都需要协商密钥,n个用户的团体就需要协商n*(n-1)/2个不同的密钥,不便于管理;而如果都使用相同密钥的话,密钥被泄漏的机率大大增加,加密也就失去了意义。

常见的对称加密算法

  • DES:分组式加密算法,以64位为分组对数据加密,加解密使用同一个算法。

  • 3DES:三重数据加密算法,对每个数据块应用三次DES加密算法。

  • AES:高级加密标准算法,是美国联邦政府采用的一种区块加密标准,用于替代原先的DES,目前已被广泛应用。

  • Blowfish:Blowfish算法是一个64位分组及可变密钥长度的对称密钥分组密码算法,可用来加密64比特长度的字符串。

二、非对称加密

非对称加密算法采用公钥和私钥两种不同的密码来进行加解密。公钥和私钥是成对存在,公钥是从私钥中提取产生公开给所有人的,如果使用公钥对数据进行加密,那么只有对应的私钥(不能公开)才能解密,反之亦然。N 个用户通信,需要2N个密钥。

用途

非对称密钥加密适合对密钥或身份信息等敏感信息加密,从而在安全性上满足用户的需求。Java精选面试题,内涵3000+Java面试题及6000+道Java笔试选择题,随时在线刷题。

非对称加密过程

1.甲使用乙的公钥并结合相应的非对称算法将明文加密后发送给乙,并将密文发送给乙。 
2.乙收到密文后,结合自己的私钥和非对称算法解密得到明文,得到最初的明文。

图示:

优点

具有比对称密钥加/解密方式更高的安全性,因为加密和解密用的是不同密钥,而且无法从一个密钥推导出另一个密钥,且公钥加密的信息只能用同一方的私钥进行解密。

缺点

1.非对称密钥加密的缺点是算法非常复杂,导致加密大量数据所用的时间较长,只适合对少量数据进行加密。而且由于在加密过程中会添加较多附加信息,使得加密后的报文比较长,容易造成数据分片,不利于网络传输。

2.无法确认公钥的来源合法性以及数据的完整性。如何确认我们接下来会说

常见算法包括:

  • RSA:RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,可用于加密,也能用于签名。

  • DSA:数字签名算法,仅能用于签名,不能用于加解密。

  • DSS:数字签名标准,技能用于签名,也可以用于加解密。

  • ELGamal:利用离散对数的原理对数据进行加解密或数据签名,其速度是最慢的。

四、单向加密

单向加密算法只能用于对数据的加密,无法被解密,其特点为定长输出、雪崩效应(少量消息位的变化会引起信息摘要的许多位变化)。

用途

单向加密算法常用于提取数据指纹,验证数据的完整性、数字摘要、数字签名等等。

单向加密过程

1.发送者将明文通过单向加密算法加密生成定长的密文串,然后传递给接收方。

2.接收方将用于比对验证的明文使用相同的单向加密算法进行加密,得出加密后的密文串。

3.将之与发送者发送过来的密文串进行对比,若发送前和发送后的密文串相一致,则说明传输过程中数据没有损坏;若不一致,说明传输过程中数据丢失了。

图示:

常见算法

MD5、sha1、sha224等等

五、密钥交换

密钥交换IKE(Internet Key Exchange)通常是指双方通过交换密钥来实现数据加密和解密

常见的密钥交换方式有下面两种:

1、公钥加密

将公钥加密后通过网络传输到对方进行解密,这种方式缺点在于具有很大的可能性被拦截破解,因此不常用

2、Diffie-Hellman

DH算法是一种密钥交换算法,其既不用于加密,也不产生数字签名。

DH算法通过双方共有的参数、私有参数和算法信息来进行加密,然后双方将计算后的结果进行交换,交换完成后再和属于自己私有的参数进行特殊算法,经过双方计算后的结果是相同的,此结果即为密钥。

如:

A 有p和g两个参数,A还有一个属于自己的私有参数x;
B 有p和g两个参数,A还有一个属于自己的私有参数y;
A和B均使用相同的加密算法计算其对应的值:value_A=p^(x%g),value_B=p^(y%g)
随后双方交换计算后的值,然后再分别使用自己的私有参数对去求次方,如:
A拿到value_B值后,对其求x平方得value_B^x=p^(xy%g);
B拿到value_A值后,对其求y平方得value_A^y=p^(xy%g);
最终得到的结果是一致的。

安全性

在整个过程中,第三方人员只能获取p、g两个值,AB双方交换的是计算后的结果,因此这种方式是很安全的。

如何确认公钥的来源合法性?

答案:使用公钥证书

公钥基础设施(PKI)

公钥基础设施是一个包括硬件、软件、人员、策略和规程的集合

用途

用于实现基于公钥密码机制的密钥和证书的生成、管理、存储、分发和撤销的功能

组成

签证机构CA、注册机构RA、证书吊销列表CRL和证书存取库CB。Java精选面试题,内涵3000+Java面试题及6000+道Java笔试选择题,随时在线刷题。

公钥证书

公钥证书是以数字签名的方式声明,它将公钥的值绑定到持有对应私钥的个人、设备或服务身份。公钥证书的生成遵循X.509协议的规定,其内容包括:证书名称、证书版本、序列号、算法标识、颁发者、有效期、有效起始日期、有效终止日期、公钥 、证书签名等等的内容。

CA(Certifi_ca_te Authority)证书认证的流程

1.客户A准备好要传送的数字信息(明文)。(准备明文)

2.客户A对数字信息进行哈希(hash)运算,得到一个信息摘要。(准备摘要)

3.客户A用CA的私钥(SK)对信息摘要进行加密得到客户A的数字签名,并将其附在数字信息上。(用私钥对数字信息进行数字签名)

4.客户A随机产生一个加密密钥(DES密钥),并用此密钥对要发送的信息进行加密,形成密文。 (生成密文)

5.客户A用双方共有的公钥(PK)对刚才随机产生的加密密钥进行加密,将加密后的DES密钥连同密文一起传送给乙。(非对称加密,用公钥对DES密钥进行加密)

6.银行B收到客户A传送过来的密文和加过密的DES密钥,先用自己的私钥(SK)对加密的DES密钥进行解密,得到DES密钥。(用私钥对DES密钥解密)

7.银行B然后用DES密钥对收到的密文进行解密,得到明文的数字信息,然后将DES密钥抛弃(即DES密钥作废)。(解密文)

8.银行B用双方共有的公钥(PK)对客户A的数字签名进行解密,得到信息摘要。银行B用相同的hash算法对收到的明文再进行一次hash运算,得到一个新的信息摘要。(用公钥解密数字签名)

9.银行B将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。(对比信息摘要和信息)

如何保证CA的公钥没有被篡改呢?

答案是没法保证CA的公钥没有被篡改。通常操作系统和浏览器会预制一些CA证书在本地。所以发送方应该去那些通过认证的CA处申请数字证书。这样是有保障的。

但是如果系统中被插入了恶意的CA证书,依然可以通过假冒的数字证书发送假冒的发送方公钥来验证假冒的正文信息。所以安全的前提是系统中不能被人插入非法的CA证书。

参考:
  • https://www.jianshu.com/p/ce3893a7be09

  • https://www.cnblogs.com/devdeng/p/5334038.html

  • https://blog.csdn.net/lycb_gz/article/details/78047417

  • https://blog.csdn.net/tanyjin/article/details/61913987

  • https://www.jianshu.com/p/3d8de6ae87d6

作者:扶公瑾以苏

blog.csdn.net/qq_36470686/article/details/85206648

往期精选  点击标题可

【057期】一道简单的 Java 面试题,答错率普遍很高!

【058期】面试官问:Java 线程中如何保证通信,都有哪些方式?

【059期】面试官问:序列化是什么,为什么要序列化,如何实现?

【060期】面试官问:如何快速实现不同 Object 对象中相同属性赋值?

【061期】面试中经常被问到 Java 引用类型原理,深入源码剖析

【062期】Java 8 中的 Stream 如此强大,那它的原理是什么吗?

【063期】面试官问:数据量很大的情况下,对于分页查询有什么优化方案吗?

【064期】面试官问:RabbitMQ 本身不支持延迟队列,那么如何实现?

【065期】面试官问:如何实现 Spring Boot 捕获全局异常与参数校验?

【066期】面试官问:说一下 Java 反射机制有哪些应用场景?

点个赞,就知道你“在看”!

;