更新時間:2021-10-21 10:17:23 來源:動力節(jié)點 瀏覽845次
Java加密工具是Java開發(fā)工具之一,java安全包下有很多加密算法類,我們可以簡單的調(diào)用它們。它們雖然功能齊全,但使用起來有點麻煩。在這里封裝了一些常用的加密算法及其常用方法,以簡化代碼。
1.client為調(diào)用類,統(tǒng)一調(diào)用encrypfacade。通過相應(yīng)的門面對象加密方法,可以選擇構(gòu)建對稱、非對稱等加密門面對象。
2.對稱加密和非對稱加密都需要密鑰。構(gòu)造時生成密鑰,然后構(gòu)造對象(HMAC比較特殊,是一種需要公鑰加密的哈希算法)。這些對象是使用外觀對象中的構(gòu)建器結(jié)束方法構(gòu)造的。其他加密算法直接使用OtherFacade對象的對應(yīng)方法來實現(xiàn)加解密。OtherFacade 會根據(jù)具體的方法調(diào)用具體的加密對象的方法,這些加密對象會調(diào)用各自的句柄。
3.使用builder方法獲取加密對象,然后調(diào)用具體方法實現(xiàn)加解密。這些方法在它們相互調(diào)用的處理程序中。
優(yōu)勢:
雖然我們在開發(fā)中一般不會用到很多加密算法,但是每個類的成員都會做延時加載,調(diào)用的時候會生成實例對象,所以我們不用擔心類的擴展。相反,我們更容易擴展它。
1.Base64的使用
String text = "123qwe!@#" ;
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String base64 = otherFacade.Base64(text);
System.out.println("base64 加密后的密文為:"+ base64);
String base64Decrypt = otherFacade.Base64Decrypt(base64);
System.out.println("base64解密后的明文為:"+base64Decrypt);
byte[] data = "123qwe!@#".getBytes();
System.out.println("數(shù)據(jù):"+Arrays.toString(data));
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
byte[] base64 = otherFacade.Base64(data);
System.out.println("Base64 加密字節(jié)數(shù)組的結(jié)果為:"+Arrays.toString(base64));
byte[] base64Decrypt = otherFacade.Base64Decrypt(base64);
System.out.println("Base64字節(jié)數(shù)組解密結(jié)果為:"+Arrays.toString(base64Decrypt));
2.MD5的使用
String text = "123qwe!@#" ;
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String md5 = otherFacade.MD5(text);
System.out.println( "md5 加密后的密文為:"+md5);
byte[] data = "123qwe!@#".getBytes();
System.out.println("數(shù)據(jù):"+Arrays.toString(data));
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
byte[] md5 = otherFacade.MD5(data);
System.out.println("md5 加密字節(jié)數(shù)組的結(jié)果為:"+Arrays.toString(md5));
3.沙的使用
String text = "123qwe!@#" ;
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String sha = otherFacade.SHA(text);
System.out.println( "SHA加密后的密文為:"+sha);
byte[] data = "123qwe!@#".getBytes();
System.out.println("數(shù)據(jù):"+Arrays.toString(data));
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
byte[] sha = otherFacade.SHA(data);
System.out.println("SHA加密字節(jié)數(shù)組的結(jié)果為:"+Arrays.toString(sha));
4.CP的使用
該加密算法為自制算法。它實際上是其他加密的混合版本。
下面的例子是可以解密的CP加密。加密時先用base64,再用innovation。解密的時候,創(chuàng)新是我隨意起的名字。
String text = "123qwe!@#" ;
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String cp = otherFacade.CP(text);
System.out.println( "CP 加密后的密文為:"+ cp);
String cpDecrypt = otherFacade.CPDecrypt(cp);
System.out.println( "CP解密后的明文為:"+cpDecrypt);
以下示例是不可逆加密。它使用了四種多重加密算法,MD5、Base64、SHA 和創(chuàng)新。這些算法的加密順序由用戶定義的內(nèi)部算法的salt值決定。也就是說,加密后的明文是一樣的,不同的salt值會導(dǎo)致不同的密文。
String text = "123qwe!@#" ;
String salt = "userName" ;
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String cp = otherFacade.CP(salt, text);
System.out.println( "CP 加密后的密文為:"+cp);
5.HMAC的使用
String text = "123qwe!@#" ;
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
HMAC hmac1 = otherFacade.HMACBuilder();
SymmetryKey key = hmac1.getKey();
System.out.println( "HMAC 生成的密鑰為:"+ key.getPublicKey());
字符串 encrypt1 = hmac1.Encrypt(text);
System.out.println( "A使用HMAC加密結(jié)果為:"+ encrypt1);
//模擬 A 將密鑰傳遞給 B
HMAC hmac2 = otherFacade.HMACBuilder(key);
// HMAC hmac2 = otherFacade.HMACBuilder(key.getPublicKey()); //同上
String encrypt2 = hmac2.Encrypt(text);
System.out.println( "B 使用 HMAC 加密結(jié)果為:"+encrypt2);
byte [] data = "123qwe!@#" .getBytes ();
System.out.println( "數(shù)據(jù):"+ Arrays.toString(data));
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
HMAC hmac1 = otherFacade.HMACBuilder();
SymmetryKey key = hmac1.getKey();
System.out.println( "HMAC 生成的密鑰為:"+ key.getPublicKey());
字節(jié)[] encrypt1 = hmac1.Encrypt(data);
System.out.println( "一個使用HMAC加密的字節(jié)數(shù)組的結(jié)果是:"+ Arrays.toString(encrypt1));
//模擬 A 將密鑰傳遞給 B
HMAC hmac2 = otherFacade.HMACBuilder(key);
// HMAC hmac2 = otherFacade.HMACBuilder(key.getPublicKey()); //同上
byte [] encrypt2 = hmac2.Encrypt(data);
System.out.println( "B 使用 HMAC 加密字節(jié)數(shù)組的結(jié)果為:"+Arrays.toString(encrypt2));
6.AES的使用
String text = "123qwe!@#" ;
SymmetryFacade symmetryFacade = EncrypFacade.getSymmetryFacade();
AES aes1 = symmetryFacade.AESBuilder();
SymmetryKey key = aes1.getKey();
System.out.println( "AES 生成的密鑰為:"+ key.getPublicKey());
String encrypt = aes1.Encrypt(text);
System.out.println( "A使用AES加密結(jié)果為:"+ encrypt);
//模擬 A 將密鑰傳遞給 B
AES aes2 = symmetryFacade.AESBuilder(key);
// AES aes2 = symmetryFacade.AESBuilder(key.getPublicKey()); //同上
字符串解密 = aes2.Decrypt(encrypt);
System.out.println( "B使用AES解密結(jié)果為:"+decrypt);
byte [] data = "123qwe!@#" .getBytes ();
System.out.println( "數(shù)據(jù):"+ Arrays.toString(data));
SymmetryFacade symmetryFacade = EncrypFacade.getSymmetryFacade();
AES aes1 = symmetryFacade.AESBuilder();
SymmetryKey key = aes1.getKey();
System.out.println( "AES 生成的密鑰為:"+ key.getPublicKey());
byte [] encrypt = aes1.Encrypt(data);
System.out.println( "A使用AES加密結(jié)果為:"+ Arrays.toString(encrypt));
//模擬 A 將密鑰傳遞給 B
AES aes2 = symmetryFacade.AESBuilder(key);
// AES aes2 = symmetryFacade.AESBuilder(key.getPublicKey()); //同上
字節(jié)[] 解密 = aes2.Decrypt(encrypt);
System.out.println( "B使用AES解密結(jié)果為:"+Arrays.toString(decrypt));
7.資源的使用
我們先來了解一下數(shù)字簽名和非對稱加密的過程
(1)數(shù)字簽名:
數(shù)字簽名是對手寫簽名的模擬,用于保證信息傳輸?shù)耐暾浴l(fā)送方的身份認證、防止交易中的抵賴。
公鑰簽名系統(tǒng)的基本思想如下:
1)發(fā)件人A用自己的私鑰對信息進行加密,對文件進行簽名
2)將簽署的文件發(fā)送給接收方 B
3)B 使用 A 的公鑰(可以從 CA 機構(gòu)等渠道獲得)對文件進行解密,從而驗證簽名。
(2)非對稱加密過程
A和B之間需要加密通信,非對稱加密過程如下:
1)A 和 B 都需要生成一對加解密密鑰進行加解密
2)A 生成一對密鑰,并將公鑰公開給其他方。將公鑰傳遞給 B 并保留私鑰。B 將公鑰傳輸給 A 并保留私鑰。
3)當 A 向 B 發(fā)送 A 消息時,它用 B 的公鑰對消息進行加密,然后將密文發(fā)送給 B
4)B收到A發(fā)來的消息后,用自己的私鑰解密
注意:A 和 B 只能使用他們的私鑰加密任何由他們的公鑰加密的信息。
String text = "123qwe!@#" ;
NoSymmetryFacade noSymmetryFacade = EncrypFacade.getNoSymmetryFacade();
// 512 是公鑰的長度。理論上,長度越長,越難開裂。如果不填參數(shù),則默認為1024。如果小于512,則使用默認值
RSA res1 = noSymmetryFacade.RESBuilder(512 );
NoSymmetryKey key1 = res1.getKey();
RSA res2 = noSymmetryFacade.RESBuilder(512 );
NoSymmetryKey key2 = res2.getKey();
//交換 publicKey
res1.setKey(key2);
res2.setKey(key1);
// res1.setKey(key2.getPublicKey()); //同上
// res2.setKey(key1.getPublicKey()); //同上
// A 先用 B 再用自己的私鑰加密
String privateEncrypt = res1.privateEncrypt(res1.publicEncrypt(text));
//生成簽名
String sign1 = res1.sign(privateEncrypt);
System.out.println( "A的RSA公鑰為:"+ key1.getPublicKey());
System.out.println( "B的RSA公鑰為:"+ key2.getPublicKey());
System.out.println( "A 的 RSA 簽名為:"+ sign1);
System.out.println( "一個使用RSA加密的數(shù)據(jù)是:"+ privateEncrypt);
// B 獲取簽名和加密數(shù)據(jù)
//先驗證簽名,判斷數(shù)據(jù)是否有變化
if (res2.verify(privateEncrypt, sign1)){
//然后解密
//先用 A 解密 B 的公鑰 Decrypt與加密相反的私鑰
String publicDecrypt = res2.privateDecrypt(res2.publicDecrypt(privateEncrypt));
System.out.println( "B 使用 RSA 解密后的數(shù)據(jù)為:"+ publicDecrypt);
}
byte [] data = "123qwe!@#" .getBytes ();
System.out.println( "數(shù)據(jù):"+ Arrays.toString(data));
NoSymmetryFacade noSymmetryFacade = EncrypFacade.getNoSymmetryFacade();
// 512 是公鑰的長度。理論上,長度越長,越難開裂。如果不填參數(shù),則默認為1024。如果小于512,則使用默認值
RSA res1 = noSymmetryFacade.RESBuilder(512 );
NoSymmetryKey key1 = res1.getKey();
RSA res2 = noSymmetryFacade.RESBuilder(512 );
NoSymmetryKey key2 = res2.getKey();
//交換 publicKey
res1.setKey(key2);
res2.setKey(key1);
// res1.setKey(key2.getPublicKey()); //同上
// res2.setKey(key1.getPublicKey()); //同上
// A 先用 B 然后用自己的私鑰加密
byte [] privateEncrypt = res1.privateEncrypt(res1.publicEncrypt(data));
//生成簽名
字節(jié)[] sign1 = res1.sign(privateEncrypt);
System.out.println( "A的RSA公鑰為:"+ key1.getPublicKey());
System.out.println( "B的RSA公鑰為:"+ key2.getPublicKey());
System.out.println( "A 的 RSA 簽名為:"+ Arrays.toString(sign1));
System.out.println( "一個使用RSA加密的數(shù)據(jù)是:"+ Arrays.toString(privateEncrypt));
// B 獲取簽名和加密數(shù)據(jù)
//先驗證簽名,判斷數(shù)據(jù)是否有變化
if (res2.verify(privateEncrypt, sign1)){
//然后解密
//先用 A 解密 B 的公鑰 Decrypt與加密
字節(jié)相反的私鑰[] publicDecrypt = res2.privateDecrypt(res2.publicDecrypt(privateEncrypt));
System.out.println( "B 使用 RSA 解密后的數(shù)據(jù)為:"+ Arrays.toString(publicDecrypt));
}
大家如果對此感興趣,想了解更多相關(guān)知識,可以來關(guān)注一下動力節(jié)點的Java在線學習,里面有更多的知識在等著大家去學習,相信對大家會有一定的幫助。