原视频地址
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类结束