Hutool-crypto 加密、解密详解!

1. 介绍

在Java开发的过程中,很多场景下都需要加密解密。

比如对敏感数据的加密,对配置文件信息的加密,通信数据的加密等等。

今天介绍的是Hutool工具包中的加密模块
crypto

2. 加密分类

加密分为三类:

常用的有AES、DES

常用的有RSA,DSA

  • 摘要加密(digest)

常用的有MD5,SHA-1

3. crypto模块整体介绍

![在这里插入图片描述](https://img-
blog.csdnimg.cn/77930fca98c1490d9ff732e675e86bfa.png?x-oss-
process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASExIXzIwMjE=,size_20,color_FFFFFF,t_70,g_se,x_16)

  • 秘钥工具
  • 加密解密工具
  • BCUtil
  • 国密算法SmUtil

![在这里插入图片描述](https://img-
blog.csdnimg.cn/64163cfff2484e2e871247963f5eb574.png?x-oss-
process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASExIXzIwMjE=,size_20,color_FFFFFF,t_70,g_se,x_16)

4. 摘要加密(Digest)

4.1 间接

摘要算法是一种能产生特殊输出格式的算法,这种算法的特点是:无论用户输入设么长度的原始数据,讲过计算后输出的密文都是固定长度的,这种算法的原理是根据一定的运算规则进行某种形式的提取,这种提取就是摘要,比摘要的数据与元数据有密切联系。只要源数据稍有改变,输出的“摘要”便完全不同,因此,基于这种原理的额算法便能够对数据完整性提供健全的保证。

但是,由于输出的密文是提取元数据经过处理的定长值,所以他已经不能还原为原数据,即消息摘要算法是不可逆的。理论上无法通过反向运算取得元数据内容。因此他通常值能被用来做数据的完整性验证。

4.2 使用

这主要介绍md5加密。

基本使用

/**
 *  md5的基本使用
 *  生成32位的密文
 */
@Test
public void MD5BasicTest() {
    System.out.println(new String(DigestUtil.md5("testaaa")));
    // 返回16进制形式  de2ec3065687316991579e6b9e6ce143
    System.out.println(DigestUtil.md5Hex("testaa"));
}

加盐、加盐位置、摘要次数

/**
 *  md5的高级使用
 *      加盐  加盐的位置  摘要次数
 */
@Test
public void MD5Test() {
    // 加盐  加盐的位置  摘要次数
    String salt = "md5Salt";
    int index = 0;
    int count = 2;
    MD5 md5 = new MD5(salt.getBytes(StandardCharsets.UTF_8), index, count);
    // 返回16进制格式
    System.out.println(md5.digestHex("testaa"));;
}

5. 对称加密(Symmetric)

5.1 介绍

对称加密(也就私钥加密),指加密和解密使用相同秘钥的加密算法。有时又叫传统密码算法,就是加密米哟啊能够从解密秘钥中推算出来,同时秘钥也可以从加密秘钥中推算出来。而在大多数的对称算法中,加密秘钥和解密秘钥是相同的,所以也成这种算法为私密秘钥算法或者单秘钥算法。

她要求发送方和接收方在安全通信之前,商定一个秘钥。

对称算法的安全性依赖于秘钥,泄露秘钥就意味着任何人都可以对他们发送和接收的消息进行解密,所以秘钥的保密性对通信的安全性至关重要。

5.2 使用

这儿介绍AES

基本使用

/**
 * 简单使用,直接使用秘钥加密解密
 */
@Test
public void AESBasicTest() {
    // 生成秘钥,也可以手动指定
    byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();

    // 构建
    SymmetricCrypto symmetricCrypto = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
    // 加密
    System.out.println(new String(symmetricCrypto.encrypt("testaa")));
    // 生成16进制格式的
    System.out.println(symmetricCrypto.encryptHex("testaa"));

    // 解密
    System.out.println(new String(symmetricCrypto.decrypt(symmetricCrypto.encrypt("testaa"))));
    // 直接解密字符串
    System.out.println(symmetricCrypto.decryptStr(symmetricCrypto.encryptHex("testaa")));
}

高级使用

/**
 * AES 高级使用
 *      mode – 模式Mode
 *      padding – Padding补码方式
 *      key – 密钥,支持三种密钥长度:128、192、256位
 *      iv – 偏移向量,加盐   必须16位
 *
 *  缺点,受到iv的影响,加密的字符串要么为空,要么为16位以上
 */
@Test
public void AESTest() {
    // 生成秘钥,也可以手动指定
    byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
    String iv = "testiv0000000000";

    AES aes = new AES(Mode.CTS, Padding.PKCS5Padding, key, iv.getBytes(StandardCharsets.UTF_8));

    // 加密
    System.out.println(aes.encryptHex("testaa1234567899"));
    // 解密
    System.out.println(aes.decryptStr(aes.encrypt("testaa1234567899")));
}

6. 非对称加密(Asymmetric)

6.1 介绍

对于非对称加密,最常用的就是RSA和DSA。

非堆成加密有公钥和私钥两个概念,私钥自己拥有,公钥公开。根据应用的不同,我们可以选择使用不同的秘钥进行加密。

  1. 签名:使用私钥加密,公钥解密。用于让所有公钥的所有者验证私钥所有者的身份并且用来防止私钥所有者发布的内容被篡改,但是不是用来保证内容不被他人获得的;
  2. 加密:用公钥加密,私钥解密。用于向公钥所有者发布星系,这个信息可能被他们篡改,但是无法被他人获取。

6.2 使用

这儿介绍RSA

基本使用

/**
 * 基本使用
 */
@Test
public void RSABasicTest() {
    RSA rsa = new RSA();
    // 获取公钥和私钥
    System.out.println(rsa.getPublicKey());
    System.out.println(rsa.getPrivateKeyBase64());
    System.out.println(rsa.getPrivateKey());
    System.out.println(rsa.getPrivateKeyBase64());
    // 私钥加密,公钥解密
    System.out.println(new String(rsa.encrypt("testaa", KeyType.PrivateKey)));
    System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PrivateKey), KeyType.PublicKey)));
    // 公钥加密,私钥解密
    System.out.println(new String(rsa.encrypt("testaa", KeyType.PublicKey)));
    System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PublicKey), KeyType.PrivateKey)));
}

高级使用

/**
 * 高级使用
 *  自定义生成 公钥和私钥
 */
@Test
public void RSATest() {
    KeyPair keyPair = SecureUtil.generateKeyPair(AsymmetricAlgorithm.RSA.getValue());
    PrivateKey privateKey = keyPair.getPrivate();
    PublicKey publicKey = keyPair.getPublic();
    System.out.println(publicKey);
    System.out.println(privateKey);
    System.out.println("----------");

    RSA rsa = new RSA(privateKey, publicKey);
    // 私钥加密,公钥解密
    System.out.println(new String(rsa.encrypt("testaa", KeyType.PrivateKey)));
    System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PrivateKey), KeyType.PublicKey)));
    // 公钥加密,私钥解密
    System.out.println(new String(rsa.encrypt("testaa", KeyType.PublicKey)));
    System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PublicKey), KeyType.PrivateKey)));

}

7. 国密算法(SM)

Hutool针对Bouncy Castle做了简化包装,用于实现国密算法中的SM2、SM3、SM4。。

国密算法工具封装包括:

  • 非对称加密和签名:SM2
  • 摘要签名算法:SM3
  • 对称加密:SM4

国密算法需要引入 Bouncy Castle 库的依赖。

这不做介绍了。

网络安全工程师(白帽子)企业级学习路线

第一阶段:安全基础(入门)

img

第二阶段:Web渗透(初级网安工程师)

img

第三阶段:进阶部分(中级网络安全工程师)

img

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

学习资源分享

学习网络安全技术的方法无非三种:

第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。

第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

第三种就是去找培训。

image.png

接下来,我会教你零基础入门快速入门上手网络安全。

网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。

第一阶段:基础准备 4周~6周

这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇
image.png

第二阶段:web渗透

学习基础 时间:1周 ~ 2周:

① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。
image.png

配置渗透环境 时间:3周 ~ 4周:

① 了解渗透测试常用的工具,例如(AWVS、SQLMAP、NMAP、BURP、中国菜刀等)。
② 下载这些工具无后门版本并且安装到计算机上。
③ 了解这些工具的使用场景,懂得基本的使用,推荐在Google上查找。

渗透实战操作 时间:约6周:

① 在网上搜索渗透实战案例,深入了解SQL注入、文件上传、解析漏洞等在实战中的使用。
② 自己搭建漏洞环境测试,推荐DWVA,SQLi-labs,Upload-labs,bWAPP。
③ 懂得渗透测试的阶段,每一个阶段需要做那些动作:例如PTES渗透测试执行标准。
④ 深入研究手工SQL注入,寻找绕过waf的方法,制作自己的脚本。
⑤ 研究文件上传的原理,如何进行截断、双重后缀欺骗(IIS、PHP)、解析漏洞利用(IIS、Nignix、Apache)等,参照:上传攻击框架。
⑥ 了解XSS形成原理和种类,在DWVA中进行实践,使用一个含有XSS漏洞的cms,安装安全狗等进行测试。
⑦ 了解一句话木马,并尝试编写过狗一句话。
⑧ 研究在Windows和Linux下的提升权限,Google关键词:提权
image.png
以上就是入门阶段

第三阶段:进阶

已经入门并且找到工作之后又该怎么进阶?详情看下图
image.png

给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

  • 17
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Crypto-js是一个JavaScript加密库,用于进行各种加密解密操作。它提供了多种加密算法,包括对称加密和非对称加密,并支持各种常见的加密模式和填充方案。 使用Crypto-js进行加密非常简单。首先,我们需要引入Crypto-js库,可以通过在网页中引入相关的JavaScript文件或者使用npm安装来实现。然后,我们可以使用其提供的各种加密算法对需要加密的数据进行加密。例如,我们可以使用AES对称加密算法对数据进行加密。以下是一个使用Crypto-js进行AES加密的示例代码: ```javascript // 引入Crypto-js库 const CryptoJS = require("crypto-js"); // 定义需要加密的数据和秘钥 const data = "Hello, World!"; const key = "1234567890abcdef"; // 进行AES加密 const encryptedData = CryptoJS.AES.encrypt(data, key).toString(); console.log(encryptedData); ``` 解密也很简单,我们只需要使用相同的密钥对加密后的数据进行解密即可。以下是一个使用Crypto-js进行AES解密的示例代码: ```javascript // 引入Crypto-js库 const CryptoJS = require("crypto-js"); // 定义密文和秘钥 const encryptedData = "U2FsdGVkX19w3MLS2+2GLWsRy0iKIxqwnwll2YBKVIQ="; const key = "1234567890abcdef"; // 进行AES解密 const decryptedData = CryptoJS.AES.decrypt(encryptedData, key).toString(CryptoJS.enc.Utf8); console.log(decryptedData); ``` 通过以上示例,我们可以看到使用Crypto-js进行加密解密非常简单。它提供了丰富的加密算法和功能,可以满足各种加密需求,是进行数据加密解密的常用工具库之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值