1. 介紹
在Java開發(fā)的過程中,很多場景下都需要加密解密。
比如對敏感數(shù)據(jù)的加密,對配置文件信息的加密,通信數(shù)據(jù)的加密等等。
今天介紹的是Hutool工具包中的加密模塊?crypto。
2. 加密分類
加密分為三類:
-
對稱加密(symmetric)
常用的有AES、DES
-
非對稱加密(asymmetric)
常用的有RSA,DSA
-
摘要加密(digest)
常用的有MD5,SHA-1
3. crypto模塊整體介紹
- 秘鑰工具
- 加密解密工具
- BCUtil
- 國密算法SmUtil
4. 摘要加密(Digest)
4.1 間接
摘要算法是一種能產(chǎn)生特殊輸出格式的算法,這種算法的特點是:無論用戶輸入設(shè)么長度的原始數(shù)據(jù),講過計算后輸出的密文都是固定長度的,這種算法的原理是根據(jù)一定的運算規(guī)則進行某種形式的提取,這種提取就是摘要,比摘要的數(shù)據(jù)與元數(shù)據(jù)有密切聯(lián)系。只要源數(shù)據(jù)稍有改變,輸出的“摘要”便完全不同,因此,基于這種原理的額算法便能夠?qū)?shù)據(jù)完整性提供健全的保證。
但是,由于輸出的密文是提取元數(shù)據(jù)經(jīng)過處理的定長值,所以他已經(jīng)不能還原為原數(shù)據(jù),即消息摘要算法是不可逆的。理論上無法通過反向運算取得元數(shù)據(jù)內(nèi)容。因此他通常值能被用來做數(shù)據(jù)的完整性驗證。
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"));
}
加鹽、加鹽位置、摘要次數(shù)
/**
* md5的高級使用
* 加鹽 加鹽的位置 摘要次數(shù)
*/
@Test
public void MD5Test() {
// 加鹽 加鹽的位置 摘要次數(shù)
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 介紹
對稱加密(也就私鑰加密),指加密和解密使用相同秘鑰的加密算法。有時又叫傳統(tǒng)密碼算法,就是加密米喲啊能夠從解密秘鑰中推算出來,同時秘鑰也可以從加密秘鑰中推算出來。而在大多數(shù)的對稱算法中,加密秘鑰和解密秘鑰是相同的,所以也成這種算法為私密秘鑰算法或者單秘鑰算法。
她要求發(fā)送方和接收方在安全通信之前,商定一個秘鑰。
對稱算法的安全性依賴于秘鑰,泄露秘鑰就意味著任何人都可以對他們發(fā)送和接收的消息進行解密,所以秘鑰的保密性對通信的安全性至關(guān)重要。
5.2 使用
這兒介紹AES
基本使用
/**
* 簡單使用,直接使用秘鑰加密解密
*/
@Test
public void AESBasicTest() {
// 生成秘鑰,也可以手動指定
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
// 構(gòu)建
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。
非堆成加密有公鑰和私鑰兩個概念,私鑰自己擁有,公鑰公開。根據(jù)應(yīng)用的不同,我們可以選擇使用不同的秘鑰進行加密。
- 簽名:使用私鑰加密,公鑰解密。用于讓所有公鑰的所有者驗證私鑰所有者的身份并且用來防止私鑰所有者發(fā)布的內(nèi)容被篡改,但是不是用來保證內(nèi)容不被他人獲得的;
- 加密:用公鑰加密,私鑰解密。用于向公鑰所有者發(fā)布星系,這個信息可能被他們篡改,但是無法被他人獲取。
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
做了簡化包裝,用于實現(xiàn)國密算法中的SM2、SM3、SM4。。
國密算法工具封裝包括:
- 非對稱加密和簽名:SM2
- 摘要簽名算法:SM3
- 對稱加密:SM4
國密算法需要引入?Bouncy Castle?
庫的依賴。文章來源:http://www.zghlxwxcb.cn/news/detail-457799.html
這不做介紹了。文章來源地址http://www.zghlxwxcb.cn/news/detail-457799.html
到了這里,關(guān)于Hutool-crypto 加密、解密詳解!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!