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

说明

POM

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

 复制代码 隐藏代码
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-crypto</artifactId>
    <version>5.7.15</version>
</dependency>

对称加密与非对称加密

对称加密

 扫VX 领Java资料,前端,测试,python等等资料都有

加密算法

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

加密模式

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

    • 优点:可以并行处理数据
    • 缺点:同样的原文生成同样的密文,不能很好的保护数据
    • 同时加密,原文是一样的,加密出来的密文也是一样的
  • CBC(Cipher-block chaining):密码块链接。每个明文块先与前一个密文块进行异或后,再进行加密,每个密文块都依赖于它前面的所有明文块<br>

    • 优点:同样的原文生成的密文不一样
    • 缺点:串行处理数据

填充模式

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

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

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

DESAES示例代码

 复制代码 隐藏代码
public class SymmetricCryptoTest {
    @Test
    public void des() {
        String text = "HelloWorld";

        // key:DES模式下,key必须为8位
        String key = "12345678";
        // iv:偏移量,ECB模式不需要,CBC模式下必须为8位
        String iv = "12345678";

        // DES des = new DES(Mode.ECB, Padding.PKCS5Padding, key.getBytes());
        DES des = new DES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv.getBytes());

        String encrypt = des.encryptBase64(text);
        System.out.println(encrypt);

        String decrypt = des.decryptStr(encrypt);
        System.out.println(decrypt);
    }

    @Test
    public void aes() {
        String text = "HelloWorld";

        // key:AES模式下,key必须为16位
        String key = "1234567812345678";
        // iv:偏移量,ECB模式不需要,CBC模式下必须为16位
        String iv = "1234567812345678";

        // AES aes = new AES(Mode.ECB, Padding.PKCS5Padding, key.getBytes());
        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv.getBytes());

        // 加密并进行Base转码
        String encrypt = aes.encryptBase64(text);
        System.out.println(encrypt);

        // 解密为字符串
        String decrypt = aes.decryptStr(encrypt);
        System.out.println(decrypt);
    }
}

非对称加密

 扫VX 领Java资料,前端,测试,python等等资料都有

简介

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

RSA示例

 复制代码 隐藏代码
public class AsymmetricCryptoTest {
    /**
     * 私钥和公钥
     */
    private static String privateKey;
    private static String publicKey;

    private static String encryptByPublic;

    /**
     * 生成公私钥
     */
    @BeforeAll
    public static void genKey() {
        KeyPair pair = SecureUtil.generateKeyPair("RSA");
        privateKey = Base64.encode(pair.getPrivate().getEncoded());
        System.out.println("私钥\t" + privateKey);
        publicKey = Base64.encode(pair.getPublic().getEncoded());
        System.out.println("公钥\t" + publicKey);
    }

    @Test
    public void test() {
        String text = "HelloWorld";

        // 初始化对象
        // 第一个参数为加密算法,不传默认为 RSA/ECB/PKCS1Padding
        // 第二个参数为私钥(Base64字符串)
        // 第三个参数为公钥(Base64字符串)
        RSA rsa = new RSA(AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue(), privateKey, publicKey);

        // 公钥加密,私钥解密
        String encryptByPublic = rsa.encryptBase64(text, KeyType.PublicKey);
        System.out.println("公钥加密\t" + encryptByPublic);
        String decryptByPrivate = rsa.decryptStr(encryptByPublic, KeyType.PrivateKey);
        System.out.println("私钥解密\t" + decryptByPrivate);

        // 私钥加密,公钥解密
        String encryptByPrivate = rsa.encryptBase64(text, KeyType.PrivateKey);
        System.out.println("私钥加密\t" + encryptByPrivate);
        String decryptByPublic = rsa.decryptStr(encryptByPrivate, KeyType.PublicKey);
        System.out.println("公钥解密\t" + decryptByPublic);

        // 此处赋值为下一个测试用
        AsymmetricCryptoTest.encryptByPublic = encryptByPublic;
    }

    /**
     * 仅使用私钥解密公钥加密后的密文
     */
    @Test
    public void test2() {
        // 传入私钥以及对应的算法
        RSA rsa = new RSA(AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue(), privateKey, null);

        // 私钥解密公钥加密后的密文
        String decrypt = rsa.decryptStr(encryptByPublic, KeyType.PrivateKey);
        System.out.println(decrypt);
    }
}

摘要加密

简介

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

MD5SHA-1示例

 复制代码 隐藏代码
public class DigesterTest {
    @Test
    public void md5() {
        String text = "HelloWorld";

        // 第一种:创建Digester对象,执行加密
        Digester md5 = new Digester(DigestAlgorithm.MD5);
        String digestHex = md5.digestHex(text);
        System.out.println(digestHex);

        // 第二种:执行使用DigestUtil
        String md5Hex = DigestUtil.md5Hex(text);
        System.out.println(md5Hex);
    }

    @Test
    public void sha1() {
        String text = "HelloWorld";

        // 第一种:创建Digester对象,执行加密
        Digester md5 = new Digester(DigestAlgorithm.SHA1);
        String digestHex = md5.digestHex(text);
        System.out.println(digestHex);

        // 第二种:执行使用DigestUtil
        String md5Hex = DigestUtil.sha1Hex(text);
        System.out.println(md5Hex);
    }
}

 扫VX 领Java资料,前端,测试,python等等资料都有

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Hutool实现AES、DES加密解密非常简单,只需要引入Hutool库,然后调用它提供的API即可。 以下是使用Hutool实现AES加密解密的示例代码: ```java import cn.hutool.core.codec.Base64; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.AES; public class AesUtil { private static final byte[] AES_KEY = "1234567890123456".getBytes(); public static String encrypt(String content) { AES aes = SecureUtil.aes(AES_KEY); byte[] encrypt = aes.encrypt(content); return Base64.encode(encrypt); } public static String decrypt(String content) { AES aes = SecureUtil.aes(AES_KEY); byte[] decrypt = aes.decrypt(Base64.decode(content)); return new String(decrypt); } } ``` 在上面的代码中,我们首先定义了一个AES_KEY作为AES加密密钥,然后通过SecureUtil.aes(AES_KEY)创建了一个AES对象。接着,我们分别定义了encrypt和decrypt方法,分别用于加密和解密。 在加密方法中,我们首先调用aes.encrypt(content)对内容进行加密,然后使用Base64进行编码,最终返回加密后的字符串。 在解密方法中,我们首先调用Base64.decode(content)将加密后的字符串进行解码,然后调用aes.decrypt对解码后的内容进行解密,最终返回解密后的字符串。 以下是使用Hutool实现DES加密解密的示例代码: ```java import cn.hutool.core.codec.Base64; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.symmetric.DES; public class DesUtil { private static final byte[] DES_KEY = "12345678".getBytes(); public static String encrypt(String content) { DES des = SecureUtil.des(DES_KEY); byte[] encrypt = des.encrypt(content); return Base64.encode(encrypt); } public static String decrypt(String content) { DES des = SecureUtil.des(DES_KEY); byte[] decrypt = des.decrypt(Base64.decode(content)); return new String(decrypt); } } ``` 在上面的代码中,我们同样定义了一个DES_KEY作为DES加密密钥,然后通过SecureUtil.des(DES_KEY)创建了一个DES对象。接着,我们分别定义了encrypt和decrypt方法,分别用于加密和解密。 在加密方法中,我们首先调用des.encrypt(content)对内容进行加密,然后使用Base64进行编码,最终返回加密后的字符串。 在解密方法中,我们首先调用Base64.decode(content)将加密后的字符串进行解码,然后调用des.decrypt对解码后的内容进行解密,最终返回解密后的字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值