什么是密钥?

密钥是一种参数,它是在明文转换为密文,或将密文转换为明文的算法中输入的参数。

密钥分类

密钥分为:对称密钥非对称密钥

如何区分是对称密钥和非对称密钥?

根据密码算法所使用的加密密钥和解密密钥是否相同能否由加密过程推导出解密过程(或者由解密过程推导出加密过程),可将密码体制分为对称密码体制(也叫作单钥密码体制、秘密密钥密码体制、对称密钥密码体制)和非对称密码体制(也叫作双钥密码体制、公开密钥密码体制、非对称密钥密码体制)。

对称密钥

也称私钥加密,属于对称密码体制,是指双方用同一个密钥进行加密和解密。

安全性依赖于:1、加密算法的安全性。2、密钥的安全性

优点:算法公开,加/解密速度快,占用空间小

缺点:密钥的管理和分发难度大

用途:信息量大的加密

代表算法DES算法、3DES算法、IDEA算法、AES算法

存在问题:无法实现数字签名、在建立安全信道之前,密钥如何传输。

非对称密钥

也称公钥加密,属于非对称密码体制。它使用了一对密钥(一个公钥,一个私钥)。A产生了一对密钥,保留私钥,传播公钥,如果B需要给A发送加密信息,B用A的公钥加密,A收到以后,再用私钥解开。

优点:安全性高,不需要交换密钥

缺点:加/解密速度慢,不适合大量加密。

用途:关键性的、核心机密数据。

代表算法:RSA算法、ElGamal算法、椭圆曲线加密算法。

存在问题

  1. 由于公钥公开,如果有人发给我消息,我不知道是谁发的。
  2. 用自己私钥加密的信息,任何知道我公钥的人都能看到。

实际使用

如果不是关键的数据可以使用DES加密,或者Base64编码不直接看到数据即可,这样速度快。

稍微重要的数据,可以用AES加密,注意保护密钥。

比较重要的数据,可以使用RSA加密

工作中使用:AES加密后再使用BASE64转码

BASE64

Base64是一种用64个字符来表示任意二进制数据的方法,可以使用hutool工具进行

MD5

MD5属于摘要算法,用于检查报文是否被篡改,而不是用于加密。

Hutool实现DES加密、AES加密

AES和DES同属对称加密算法,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。

在Java中,AES、DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程。

引入Hutool依赖

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.22</version>
</dependency>
1. 使用方法 
  
1. AES加密解密
//需要加密的明文
String content = "test中文";
//随机生成密钥
byte[] key =  .generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//构建  
AES aes = SecureUtil.aes(key);
//加密
byte[] encrypt = aes.encrypt(content);
//解密
byte[] decrypt = aes.decrypt(encrypt);
//16进制的加密,同上面是两种不同的加密
//加密为16进制表示
String encryptHex = aes.encryptHex(content);
//解密为原字符串
String decryptStr = aes.decryptStr(encryptHex);
2.DES加密
//需要加密的明文
String content = "test中文";
//随机生成密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
//构建
DES des = SecureUtil.des(key);
//加密解密
byte[] encrypt = des.encrypt(content);
byte[] decrypt = des.decrypt(encrypt);
//同上
//加密为16进制,解密为原字符串
String encryptHex = des.encryptHex(content);
String decryptStr = des.decryptStr(encryptHex);