加密解密

数据签名、加密是前后端开发经常需要使用到的技术,应用场景包括不限于用户登入、数据交易、信息通讯等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法来达到业务目标。

  • 对称加密算法;
  • 非对称加密算法;
  • 哈希算法,加盐哈希算法(单向加密);
  • 数字签名。

使用加密签名算法,可以达到下面的安全目标:

保密性:防止用户的数据被读取;
数据完整性:防止数据被篡改;
身份验证:确保数据发自特定的一方。

0 填充模式

某些加密算法要求明文需要按一定长度对齐,叫做块大小(BlockSize),比如16字节,那么对于一段任意的数据,加密前需要对最后一个块填充到16 字节,解密后需要删除掉填充的数据。

  • ZeroPadding,数据长度不对齐时使用0填充,否则不填充。
  • PKCS7Padding,假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小。
  • PKCS5Padding,PKCS7Padding的子集,块大小固定为8字节。

<mark>由于使用PKCS7Padding/PKCS5Padding填充时,最后一个字节肯定为填充数据的长度,所以在解密后可以准确删除填充的数据,而使用ZeroPadding填充时,没办法区分真实数据与填充数据,所以只适合以\0结尾的字符串加解密。</mark>

1 对称加密

对称加密算法加密和解密时使用同一把秘钥。操作比较简单,加密速度快,秘钥简单。经常在消息发送方需要加密大量数据时使用。缺点是风险都在这个秘钥上面,一旦被窃取,信息会暴露。所以安全级别不够高。常用对称加密算法有DES,3DES,AES等。在jdk中也都有封装。

1.1 DES

DES的秘钥为8个字节,64个bit位。(不适应当今分布式开放网络对数据加密安全性的要求)在Java进行DES、3DES和AES三种对称加密算法时,常采用的是NoPadding(不填充)、Zeros填充(0填充)、PKCS5Padding填充。

三种填充模式的区别(PKCS7Padding/PKCS5Padding/ZeroPadding)

1.2 DES

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:

3DES加密过程为:C=Ek3(Dk2(Ek1 ( P ) )

3DES解密过程为:P=Dk1(EK2(Dk3 ( C )))

参考链接
https://blog.csdn.net/weixin_41563161/article/details/109480714

1.3 AES

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

那么为什么原来的DES会被取代呢?原因就在于其使用56位密钥,比较容易被破解。而AES可以使用128bit位、192、和256位密钥,并且用128位分组加密和解密数据,相对来说安全很多。完善的加密算法在理论上是无法破解的,除非使用穷尽法。

2 非对称加密

非对称加密,顾名思义就是加密与解密的过程不是对称的,不是用的同一个秘钥。非对称加密有个公私钥对的概念,也就是有两把秘钥,一把是公钥,一把是私钥,一对公私钥有固定的生成方法,在加密的时候,用公钥去加密,接收方再用对应的私钥去解密。使用时可以由接收方生成公私钥对,然后将公钥传给加密方,这样私钥不会在网络中传输,没有被窃取的风险。比如github底层的ssh协议就是公私钥非对称加密。并且公钥是可以由私钥推导出来的,反过来却不行,由通过公钥无法推导出私钥。常用算法有RSA,DSA,ECC等。ECC也是比特币底层用的比较多的算法。通过和对称加密的对比,可以看到,非对称加密解决了秘钥传输中的安全问题。

2.1 RSA加密算法

<mark>RSA加密算法</mark>是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案 之一。RSA 是第一个能同时用于加密和数字签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。

相同长度的秘钥,RSA和DSA的安全性差不多。一般情况下DSA多用于数字签名,签名的效率比RSA更高。RSA支持加密和加签操作。所以当我们需要同时进行加密和加签操作的时候一般选择RSA算法。

这边提供一个在线生成RSA公私钥对的网站,可以选择生成512,1024,2048或者是4096位的秘钥。使用起来比较方便。

下面给出一个RSA算法的列子:

2.2 DSA

一般用于数字签名场合。

2.3 ECC

ECC 也是一种== 非对称加密算法==,主要优势是在某些情况下,它比其他的方法使用 更小的密钥,比如 RSA 加密算法,提供相当的或更高等级的安全级别。不过一个缺点是加密和解密操作的实现比其他机制 时间长 (相比RSA 算法,该算法对 CPU 消耗严重)。

3 哈希算法(单向加密)

单向加密算法只能用于对数据的加密,无法被解密,其特点为定长输出、雪崩效应。单向加密算法用于不需要对信息进行解密或读取的场合,比如用来比较两个信息值是否一样而不需要知道信息具体内容,在实际中的一个典型应用就是对数据库中的用户信息进行加密,比如当创建一个新用户及密码时,将这些信息经过单向加密后再保存到数据库中。

常见的算法包括

  • MD5;
  • SHA等

3.1 MD5

参考链接
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。常用于数据库密码存储。MD5值是128bit位的数据,一般情况下使用一个长度是32的十六进制字符串来显示。 具体特点如下:

  • 压缩性:任意长度的数据,算出的MD5值长度都是固定的。

  • 容易计算:从原数据计算出MD5值很容易。

  • 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

  • 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

3.2 SHA

SHA代表安全散列算法,SHA-1和SHA-2是该算法的两个不同版本。它们在构造(如何从原始数据创建结果散列)和签名的位长方面都不同。您应该将SHA-2视为SHA-1的继承者,因为它是一个整体改进。

首先,人们把重点放在比特长度上作为重要的区别。SHA-1是160位散列。SHA-2实际上是哈希的“家族”,有各种长度,最受欢迎的是256位。

各种各样的SHA-2哈希可能会引起一些混乱,因为网站和作者以不同的方式表达它们。如果你看到“SHA-2”,“SHA-256”或“SHA-256位”,那些名称指的是同一个东西。如果您看到“SHA-224”,“SHA-384”或“SHA-512”,则它们指的是SHA-2的备用位长度。您可能还会看到一些网站更明确,并写出算法和比特长度,例如“SHA-2 384”。

4.各个加密算法的比较

4.1 散列算法的比较

名称 安全性 速度
SHA-1
MD5

4.2 对称加密算法比较

名称 密钥名称 运行速度 安全性 资源消耗
DES 56位 较快 中性
AES 128、192、256位

4.3 非对称算法的比较

名称 成熟度 安全性 运算速度 资源消耗
RSA
ECC

5. 编码方式 Base64

我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号;

Base64有很多实现,JDK默认实现、Apache包下面的实现和Spring提供的实现等。平时我们用的时候推荐使用Apache下面的实现。

BASE64https://blog.csdn.net/happylee6688/article/details/43950521