终于知道公钥、私钥、对称、非对称加密是什么了

作者: 风筝 / 2023-08-14

Java, JDK, 对称加密, 非对称加密, 公钥, 私钥

有接入过第三方服务的同学应该都接触过公钥、私钥这类的说明,尤其是一些对参数要求验证的服务,比如支付类的。

通常对于高保密要求的参数都会有加密要求,这时候,如果你之前不了解加密算法,就很容易被公钥、私钥的使用给绕迷糊了。有时候虽然接口都调通了,但是还是一头雾水,这就通了?

那接下来我们就来解开这团迷雾。咱们只讲逻辑和一部分逻辑,不讲数学算法,因为数学这块儿我也不是很懂。

加密算法在大类上分为对称机密和非对称加密,都用来加密,只不过使用场景、性能、安全性方面有些不同。

首先说什么是加密呢?

加密就是通过一种方式将一个显而易见的东西变成难以理解的东西。

比如这儿有个字符串“我真棒”,这三个字儿要摆在你面前不是一眼就知道我很棒了吗。

但是我要给你看这样一串东西呢?你还能一下子知道是什么意思吗?

232 10 5,33 50 12,109 45 1

其实这还是那三个字,只不过是经过加密的密文,只有知道了加密的方法才能还原出来,也就是解密。

加密的过程可能是这样的:

  1. 首先买一本叫做《人间清醒》的书;
  2. 然后按照逗号分隔,每一个逗号分隔开的表示一个字;
  3. 然后每一组是三个数字,第一个数字表示所在页,第二个数字表示所在行,第三个数字表示所在列(第几个字),所以 232 10 5,表示第 232 页,第 10 行,第 5 个字。

还有,比如我之前有个温州的同事,他打电话的时候对于我们来说就是语音加密了,能听见他的声音,但是说的是什么内容一个字也听不出来。这也可以理解为一种加密,把普通话的发音转换成温州方言的发音。

对称加密

对称加密中所说的对称是对加密和解密而言的,也就是加密和解密的过程使用相同的密钥。

我们经常用到的落库加密、文件加密都可以使用对称加密的方式。

目前最常用也是最安全的对称加密算法是 AES,AES 还分为 AES-128、AES-192 和 AES256,后面的数字代表加密密钥的位数,位数越高呢,加密效果也就越好,更加不容易被破解。同时,位数越高,加密和解密过程中的计算量也会越大,内存占用也就更大,消耗的资源更多,需要的时间也就更长。

有利有弊,看你的需求而定。基本上,一般场景下 128 位就足够安全了。AES 到目前为止,可以说没有漏洞,而且 128 位就可以保证不会被暴力破解。而更高位数的可能会用到国家级的保密数据上。

AES 是分组加密算法,除此之外,大部分的加密算法都是分组加密算法。

块加密算法就是将需要加密的数据分成一个个的固定长度的分组,比如 128 位一组,然后分别用算法对每一组进行加密,如果最后一组不足 128 位的话,还要用填充算法进行填充,保证达到 128 位。

常用的分组算法有 CTR 和 GCM,CTR 和 GCM 有并行计算的能力,并且, GCM 还能额外提供对消息完整性、真实性的验证能力。

所以我们在某些地方可能看到 AES-128-GCM、AES-256-CTR 这样的写法,前面表示加密算法,后面代表分组算法。

不足之处

对称加密本身从算法层面来说已经足够安全了,但是在密钥分发方面有些不太容易管理。

因为加解密的密钥相同。我加密的数据想要被别人使用,我就要把密钥告诉要使用的人。知道密钥的人、保存密钥的服务器越多,风险就越大。约束自己容易,约束别人难啊。但凡有一方不小心把密钥泄露就完。一个木桶能装多少水是由最低的一块木板决定的。

非对称加密

由于对称加密的密钥分发问题,非对称加密算法可以完美的解决。

刚毕业不就的时候,和第三方服务做集成,有关于接口参数加密的指引文档,虽然按照人家提供的 demo 可以正常集成,但是文档上说的公钥、私钥还是搞的很迷糊。

现在就来捋一捋啊,就以第三方服务角度来说。假设我是一个支付服务商,为大家提供支付接口的。

公钥

公钥是开放的,谁都可以获取。我作为一个支付服务商,任何到我平台上注册的用户都可以获取到公钥,公钥可以是相同的。

私钥

私钥是绝密的,我作为一个支付服务商,必须将私钥妥善保存,无论是保存在数据库中还是保存在服务器,都必须保证私钥不对外,只有我自己可以使用。

  1. 使用我服务的用户获取公钥;
  2. 调用方(客户)用公钥对接口参数进行加密,然后调用接口;
  3. 我方(支付服务商)用私钥对参数进行解密,然后使用参数进行业务处理;

以上是公钥、私钥的使用过程,这样一看就很明确了。

之所以说是非对称加密,是因为私钥只是用来解密的,用公钥加密过的数据,只有用对应的私钥才能解密出来。所以说,即使有那么多人得到了相同的公钥,也无法获取别人加密过的数据。

最常用的非对称加密算法是 RSA ,RSA 有 1024、2048、3072、4096、8129、16384 甚至更多位。目前 3072 位及以上的密钥长度被认为是安全的,曾经大量使用的 2048 位 RSA 现在被破解的风险在不断提升,已经不推荐使用了

RSA 算法的性能要比对称加密 AES 算法差 1000 倍左右,虽然数学原理上不太明白,但是有数学常识就可以知道,使用不同的密钥进行加密和解密,必然要比使用相同密钥的算法复杂很多,由此肯定会带来性能上的开销。

非对称加密适合用于那些对安全性要求更高的场景,例如支付场景、数字证书、数据加密传输等等。

相关文章

什么时候用 Runnable?什么时候用 Callable ?
什么是零拷贝|Java中的零拷贝
RPC框架的核心是什么?
0. Spring Cloud 是什么
1. Spring Cloud Eureka 实现服务注册与发现
风筝

作者

风筝

古时的风筝,一个平庸的程序员,主语言 Java,第二语言 Python,其实学 Python 的时间比 Java 还要早。喜欢写博客,写博客的过程能加深自己对一个知识点的理解,同时还可以分享给他人。喜欢做一些小东西,所以也会一些前端的东西,React、JavaScript、CSS 都会一些,做一些小工具还够用。