Java使用Hutool工具完成加密解密

说明

POM

使用 Hutool 加密解密工具时,引入如下依赖:

  1. <dependency>  
  2.     <groupId>cn.hutool</groupId>  
  3.     <artifactId>hutool-crypto</artifactId>  
  4.     <version>5.7.15</version>  
  5. </dependency>  

对称加密与非对称加密

Java使用Hutool工具完成加密解密

对称加密

加密算法

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

常见加密算法:

  • 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
  • 常见加密算法
    • DES(Data Encryption Standard):即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
    • AES(Advanced Encryption Standard):高级加密标准.在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
  • 特点
    • 加密速度快, 可以加密大文件
    • 密文可逆, 一旦密钥文件泄漏,就会导致数据暴露
    • 加密后编码表找不到对应字符,出现乱码,一般结合Base64使用

加密模式

ECB(Electronic codebook):电子密码本。需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。

Java使用Hutool工具完成加密解密

优点:可以并行处理数据。

缺点:同样的原文生成同样的密文,不能很好的保护数据。

同时加密,原文是一样的,加密出来的密文也是一样的。

CBC(Cipher-block chaining):密码块链接。每个明文块先与前一个密文块进行异或后,再进行加密,每个密文块都依赖于它前面的所有明文块。

Java使用Hutool工具完成加密解密

优点:同样的原文生成的密文不一样。

缺点:串行处理数据。

填充模式

当需要按块处理的数据, 数据长度不符合块处理需求时, 按照一定的方法填充满块长的规则。

  • NoPadding不填充
    • DES加密算法下, 要求原文长度必须是8byte的整数倍
    • AES加密算法下, 要求原文长度必须是16byte的整数倍
  • PKCS5Padding
    • 数据块的大小为8位, 不够就补足

Tips:默认情况下, 加密模式和填充模式为:ECB/PKCS5Padding。如果使用CBC模式,需要增加参数初始化向量IV。

DES与AES示例代码

  1. public class SymmetricCryptoTest {  
  2.     @Test  
  3.     public void des() {  
  4.         String text = "HelloWorld";  
  5.   
  6.         // key:DES模式下,key必须为8位  
  7.         String key = "12345678";  
  8.         // iv:偏移量,ECB模式不需要,CBC模式下必须为8位  
  9.         String iv = "12345678";  
  10.   
  11.         // DES des = new DES(Mode.ECB, Padding.PKCS5Padding, key.getBytes());  
  12.         DES des = new DES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv.getBytes());  
  13.   
  14.         String encrypt = des.encryptBase64(text);  
  15.         System.out.println(encrypt);  
  16.   
  17.         String decrypt = des.decryptStr(encrypt);  
  18.         System.out.println(decrypt);  
  19.     }  
  20.   
  21.     @Test  
  22.     public void aes() {  
  23.         String text = "HelloWorld";  
  24.   
  25.         // key:AES模式下,key必须为16位  
  26.         String key = "1234567812345678";  
  27.         // iv:偏移量,ECB模式不需要,CBC模式下必须为16位  
  28.         String iv = "1234567812345678";  
  29.   
  30.         // AES aes = new AES(Mode.ECB, Padding.PKCS5Padding, key.getBytes());  
  31.         AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv.getBytes());  
  32.   
  33.         // 加密并进行Base转码  
  34.         String encrypt = aes.encryptBase64(text);  
  35.         System.out.println(encrypt);  
  36.   
  37.         // 解密为字符串  
  38.         String decrypt = aes.decryptStr(encrypt);  
  39.         System.out.println(decrypt);  
  40.     }  
  41. }  

非对称加密

简介

  • 非对称加密算法又称现代加密算法。
  • 非对称加密是计算机通信安全的基石,保证了加密数据不会被破解。
  • 与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)
    • 公开密钥和私有密钥是一对
    • 如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。
    • 如果用私有密钥对数据进行加密,只有用对应的公开密钥才能解密。
  • 因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
  • 特点
    • 加密和解密使用不同的密钥
    • 处理数据的速度较慢, 因为安全级别高
  • 常见算法
    • RSA
    • ECC

RSA示例

  1. public class AsymmetricCryptoTest {  
  2.     /** 
  3.      * 私钥和公钥 
  4.      */  
  5.     private static String privateKey;  
  6.     private static String publicKey;  
  7.   
  8.     private static String encryptByPublic;  
  9.   
  10.     /** 
  11.      * 生成公私钥 
  12.      */  
  13.     @BeforeAll  
  14.     public static void genKey() {  
  15.         KeyPair pair = SecureUtil.generateKeyPair("RSA");  
  16.         privateKey = Base64.encode(pair.getPrivate().getEncoded());  
  17.         System.out.println("私钥\t" + privateKey);  
  18.         publicKey = Base64.encode(pair.getPublic().getEncoded());  
  19.         System.out.println("公钥\t" + publicKey);  
  20.     }  
  21.   
  22.     @Test  
  23.     public void test() {  
  24.         String text = "HelloWorld";  
  25.   
  26.         // 初始化对象  
  27.         // 第一个参数为加密算法,不传默认为 RSA/ECB/PKCS1Padding  
  28.         // 第二个参数为私钥(Base64字符串)  
  29.         // 第三个参数为公钥(Base64字符串)  
  30.         RSA rsa = new RSA(AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue(), privateKey, publicKey);  
  31.   
  32.         // 公钥加密,私钥解密  
  33.         String encryptByPublic = rsa.encryptBase64(text, KeyType.PublicKey);  
  34.         System.out.println("公钥加密\t" + encryptByPublic);  
  35.         String decryptByPrivate = rsa.decryptStr(encryptByPublic, KeyType.PrivateKey);  
  36.         System.out.println("私钥解密\t" + decryptByPrivate);  
  37.   
  38.         // 私钥加密,公钥解密  
  39.         String encryptByPrivate = rsa.encryptBase64(text, KeyType.PrivateKey);  
  40.         System.out.println("私钥加密\t" + encryptByPrivate);  
  41.         String decryptByPublic = rsa.decryptStr(encryptByPrivate, KeyType.PublicKey);  
  42.         System.out.println("公钥解密\t" + decryptByPublic);  
  43.   
  44.         // 此处赋值为下一个测试用  
  45.         AsymmetricCryptoTest.encryptByPublic = encryptByPublic;  
  46.     }  
  47.   
  48.     /** 
  49.      * 仅使用私钥解密公钥加密后的密文 
  50.      */  
  51.     @Test  
  52.     public void test2() {  
  53.         // 传入私钥以及对应的算法  
  54.         RSA rsa = new RSA(AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue(), privateKey, null);  
  55.   
  56.         // 私钥解密公钥加密后的密文  
  57.         String decrypt = rsa.decryptStr(encryptByPublic, KeyType.PrivateKey);  
  58.         System.out.println(decrypt);  
  59.     }  
  60. }  

摘要加密

简介

  • 消息摘要Message Digest又称为数字摘要Digital Digest
  • 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生
  • 使用数字摘要生成的值是不可以篡改的,为了保证文件或者值的安全
  • 特点:
    • 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如:
      • MD5算法摘要的消息有128个比特位。
      • SHA-1算法摘要的消息最终有160比特位。
    • 只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。
    • 消息摘要是单向、不可逆的
  • 常见算法
    • MD5
    • SHA1
    • SHA256
    • SHA512

MD5和SHA-1示例

  1. public class DigesterTest {  
  2.     @Test  
  3.     public void md5() {  
  4.         String text = "HelloWorld";  
  5.   
  6.         // 第一种:创建Digester对象,执行加密  
  7.         Digester md5 = new Digester(DigestAlgorithm.MD5);  
  8.         String digestHex = md5.digestHex(text);  
  9.         System.out.println(digestHex);  
  10.   
  11.         // 第二种:执行使用DigestUtil  
  12.         String md5Hex = DigestUtil.md5Hex(text);  
  13.         System.out.println(md5Hex);  
  14.     }  
  15.   
  16.     @Test  
  17.     public void sha1() {  
  18.         String text = "HelloWorld";  
  19.   
  20.         // 第一种:创建Digester对象,执行加密  
  21.         Digester md5 = new Digester(DigestAlgorithm.SHA1);  
  22.         String digestHex = md5.digestHex(text);  
  23.         System.out.println(digestHex);  
  24.   
  25.         // 第二种:执行使用DigestUtil  
  26.         String md5Hex = DigestUtil.sha1Hex(text);  
  27.         System.out.println(md5Hex);  
  28.     }  
  29. }  

原文地址

https://www.52pojie.cn/thread-1539803-1-1.html

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
搜索