最近感觉没有什么要写的,因为太空虚…可能是因为刚进入一份工作,哪哪的都不适应,也可能因为团队中都是大佬,压力山大…但是还是要不断努力!!
这两天项目中要做一些数据加密处理,发现一种之前没有用过的算法PBEWITHMD5andDES,只是简单了解,方便复习,简述一下.
PBE(Password Based Encryption,基于口令加密)算法是一种基于口令的加密算法,其特点在于口令是由用户自己掌握的,采用随机数杂凑多重加密等方法保证数据的安全性, PBE算法没有密钥的概念,密钥在其它对称加密算法中是经过算法计算得出来的,PBE算法则是使用口令替代了密钥。
就是PBE作者说的,PBE并没有真正的构建加密/解密算法,是对加密/加密算法的一种封装,让其更具安全性.
下面在代码中介绍PBEWITHMD5andDES的应用和具体概念
/**
* 定义使用的算法为:PBEWITHMD5andDES算法
*/
public static final String ALGORITHM = "PBEWITHMD5ANDDES";
/**
* 定义迭代次数为1000次,次数越多,运算越大,越不容易破解之类。
*/
private static final int ITERATIONCOUNT = 100;//orgin 1000
private String saltStr;
/**
* 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. 盐长度必须为8字节的倍数
*
* @return byte[] 盐值
* */
private byte[] getSalt() throws Exception {
// 实例化安全随机数 // 产出盐
SecureRandom random = new SecureRandom();
return random.generateSeed(8);
}
/**
* 根据PBE密码生成一把密钥
*
* @param password
* 生成密钥时所使用的密码
* @return Key PBE算法密钥
* */
private Key getPBEKey(String password) throws Exception {
// 实例化使用的算法
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
// 设置PBE密钥参数
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
// 生成密钥
SecretKey secretKey = keyFactory.generateSecret(keySpec);
return secretKey;
}
/**
* 加密明文字符串
*
* @param plaintext
* 待加密的明文字符串
* @param password
* 生成密钥时所使用的密码
* @return 加密后的密文字符串
* @throws Exception
*/
public String encrypt(String plaintext, String password)
throws Exception {
//获取根据PBE口令生成的key
Key key = getPBEKey(password);
//获取8字节位的盐
byte[] salt = getSalt();
//将盐进行加密
saltStr = Base64.encodeBase64String(salt);
//设置PBE参数的盐和运算次数
PBEParameterSpec parameterSpec = new PBEParameterSpec(salt,ITERATIONCOUNT);
//构建实例化
Cipher cipher = Cipher.getInstance(ALGORITHM);
//cipher对象使用之前还需要初始化,共三个参数("加密模式或者解密模式","密匙","向量")
cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
//数据转换
byte encipheredData[] = cipher.doFinal(plaintext.getBytes("UTF-8"));
return Base64.encodeBase64String(encipheredData);
}
public String getSaltStr(){
return saltStr;
}
/**
* 解密密文字符串
*
* @param ciphertext
* 待解密的密文字符串
* @param password
* 生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致)
* @param saltStr
* 盐值(如需解密,该参数需要与加密时使用的一致)
* @return 解密后的明文字符串
* @throws Exception
*/
public String decrypt(String ciphertext, String password, String saltStr)
throws Exception {
//转换密钥
Key key = getPBEKey(password);
//解密盐
byte[] salt = Base64.decodeBase64(saltStr);
//实例化PBE参数
PBEParameterSpec parameterSpec = new PBEParameterSpec(salt,
ITERATIONCOUNT);
//实例化
Cipher cipher = Cipher.getInstance(ALGORITHM);
//初始化
cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
//数据转换
byte[] passDec = cipher.doFinal(Base64.decodeBase64(ciphertext));
//返回明文字符
return new String(passDec);
}
在我的观点看来,PBE使用了一种安全的加密方式,使用口令代替密钥,每次在一方发送口令,双方确认口令之后进行交互.交互中口令发送方会把salt加密并将加密的密文发送,另外一方就可以直接进行解密.口令和salt缺一不可.