原視頻地址
Imooc_JAVA實現對稱加密4-1 JAVA-對稱加密算法PBE
package PBE;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import org.apache.commons.codec.binary.Hex;
import Base64.Base64;
public class PBE {
private static String src = "imooc security pbe";
public static void main(String[] args) {
jdkPBE();
}//main方法結束
private static void jdkPBE(){
try {
/*鹽值就是在密碼hash過程中添加的額外的隨機值,如,用戶的ID就可以作爲鹽值,
來進行hash,生產密文,進而,可以做到密碼保護的目的
*/
//初始化鹽(口令):加密的隨機數或字符串 通過隨機數random來產生鹽
//SecureRandom提供加密的強隨機數生成器 (RNG)
SecureRandom random = new SecureRandom();
byte[] salt = random.generateSeed(8);//返回給定的種子字節數量,該數量可使用此類用來爲其自身提供種子的種子生成算法來計算。
//加密 首先定義密碼
//口令與密鑰
String password = "jluzh";
//通過PBEKeySpec類實例化一個能夠把 鹽 密碼 口令轉爲密鑰 的對象pbeKeySpec
//PBEKeySpec可以將密碼視爲某種原始密鑰內容,由此加密機制使用其導出一個密鑰
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
//SecretKeyFactory類祕密密鑰的工廠。 密鑰工廠用來將密鑰(類型 Key 的不透明加密密鑰)轉換爲密鑰規範(底層密鑰材料的透明表示形式)
//getInstance返回轉換指定算法的祕密密鑰的 SecretKeyFactory 對象
//algorithm參數 - 所請求的祕密密鑰算法的標準名稱
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
//通過factory 的generateSecret 生成Key 根據提供的密鑰規範(密鑰材料)生成 SecretKey 對象 keySpec - 祕密密鑰的規範(密鑰材料)
// generateSecret()參數爲祕鑰材料desKeySpec 該生成我們所需要的祕鑰
Key key = factory.generateSecret(pbeKeySpec);
//加密
//實例化一個PBE的參數的輸入材料 爲 PKCS #5 標準中所定義的基於密碼的加密法構造一個參數集合。
//salt - salt。複製該 salt 的內容來防止後續修改。 iterationCount - 迭代計數。
PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt,100);
//KEY轉換完之後 Cipher類的實例來進行加密和解密操作
//getInstance("加解密算法/工作方式/填充方式")
//Cipher此類爲加密和解密提供密碼功能
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
//cipher.init(opmode, certificate); 第一個參數爲模式 第二個參數爲轉換後的KEY
// Cipher.ENCRYPT_MODE加密模式 轉換後的KEY:convertsecretKey
cipher.init(Cipher.ENCRYPT_MODE, key,pbeParameterSpec);
//doFinal(input); input即使要被加密的內容
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("jdk pbe encrypt:"+org.apache.commons.codec.binary.Base64.encodeBase64String(result));
//解密
//cipher.init(opmode, certificate); 第一個參數爲模式 第二個參數爲轉換後的KEY
// Cipher.ENCRYPT_MODE解密模式 轉換後的KEY:convertsecretKey
cipher.init(Cipher.DECRYPT_MODE, key,pbeParameterSpec);
result = cipher.doFinal(result);
System.out.println("jdk pbe decrypt:"+new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}//PBE類結束