版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31301681/article/details/77801384
一.PBE(Password Based Encryption,基于口令加密)是一种基于口令的加密算法,其特点是使用口令代替了密钥,而口令由用户自己掌管,采用随机数(这里称之为 盐 或者 扰码)杂凑多重加密等方法保证数据的安全性。PBE 算法并没有 真正构建新的加密/解密算法,而是对已知的对称加密算法(eg:DES算法)做了包装;使用PBE算法对数据做加密/解密操作时,其实是使用了 DES 或者 AES 等其他对称加密算法做了相应的操作。
二.PEB 的算法还是比较多的(或者说是包装算法),如图:
三.实现的方式有 jdk , 跟 bc 的两种 方式,下面给出 jdk 的具体实现(java):
/**
* 获取 盐(扰码)
* @return
*/
public static byte [] PEB_GetSalt(){
SecureRandom random = new SecureRandom();
byte [] salt = random.getSeed(8);
return salt;
}
/**
* 将口令转为秘钥
* @param password
* @return
* @throws Exception
*/
public static Key PEB_PassWordToKey (String password)throws Exception{
PBEKeySpec pebkeyspec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");// 指定算法
return factory.generateSecret(pebkeyspec);
}
/**
* JDK 使用 peb 进行数据的加密
* @param src
* @param encryptKey
* @return
* @throws Exception
*/
public static byte [] JDK_PEB_Decrypt(String src,byte [] salt,String password) throws Exception{
PBEParameterSpec paraSpec = new PBEParameterSpec(salt,10);
//加密
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE, PEB_PassWordToKey(password),paraSpec);
byte [] result = cipher.doFinal(src.getBytes());
return result;
}
/**
* jdk peb 对数据进行解密
* @param encryptBytes
* @param salt
* @param password
* @return
* @throws Exception
*/
public static String JDK_PEB_Encrypt(byte [] encryptBytes,byte [] salt,String password) throws Exception{
PBEParameterSpec paraSpec = new PBEParameterSpec(salt,10);
//解密
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.DECRYPT_MODE, PEB_PassWordToKey(password),paraSpec);
String result = new String(cipher.doFinal(encryptBytes));
return result;
}