利用DES算法对加密连接数据库明文密码
DES算法简介: DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,**长64位,**事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个**都有奇数个1)分组后的明文组和56位的**按位替代或交换的方法形成密文组的加密方法。
基本原理: 其入口参数有三个:key、data、mode。key为加密解密使用的**,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,**只用到了64位中的56位,这样才具有高的安全性。
主要流程: DES算法把64位的明文输入块变为64位的密文输出块,它所使用的**也是64位,整个算法的主流程图如下:
以下使用DES算法对连接数据库的配置信息进行加密和解密的实例:
1.编写一个进行加密和解密的工具类:
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* DES是一种对称加密算法,所谓的对称加密算法即:加密和解密都是使用一种相同 ** 的加密算法
*/
public class DESUtil {
private static Key key;
// 设置指定的**
private static String KEY_STR = "myKey";
// 指定的编码格式
private static String CHARSETNAME = "UTF-8";
// 指定是DES算法
private static String ALGORITHM = "DES";
static {
try {
// 生成DES算法对象
KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
// 运用SHA1安全策略
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
// 设置**种子
secureRandom.setSeed(KEY_STR.getBytes());
// 初始化居于SHA1的算法对象
generator.init(secureRandom);
// 生成**对象
key = generator.generateKey();
generator = null;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/*
* 获取加密后的信息
*/
public static String getEncryptString(String str) {
// 居于BASE64编码,接收byte[]并转换成String
BASE64Encoder base64encoder = new BASE64Encoder();
try {
// 按UTF8编码
byte[] bytes = str.getBytes(CHARSETNAME);
// 获取加密对象
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化密码信息
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] doFinal = cipher.doFinal(bytes);
return base64encoder.encode(doFinal);
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e);
}
}
/*
* 获取解密后的信息
*/
public static String getDecryptString(String str) {
// 居于BASE64编码,接收byte[]并转换成String
BASE64Decoder base64decoder = new BASE64Decoder();
try {
// 将字符串decode成byte[]
byte[] bytes = base64decoder.decodeBuffer(str);
// 获取解密对象
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化解密信息
cipher.init(Cipher.DECRYPT_MODE, key);
// 解密
byte[] doFinal = cipher.doFinal(bytes);
// 返回解密后的信息
return new String(doFinal, CHARSETNAME);
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e);
}
}
/* public static void main(String[] args) {
System.out.println(getEncryptString("root"));
System.out.println(getEncryptString("123 "));
}*/
}
2.利用上述工具类的 getEncryptString(String str) 对jdbc.properties配置文件里的数据库名和密码加密:
3.加密完成后,启动服务器读取到连接数据库的xml配置文件时需要将以上已加密的字段进行解密,所以还需要编写继承 PropertyPlaceholderConfigurer 的类:
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
public class EncryptPropertyPlaceholderConfigurer extends
PropertyPlaceholderConfigurer {
// 指定需要解密的字段数组
private String[] encryptPropNames = { "jdbc.username", "jdbc.password" };
/*
* 对关键的属性进行转换
*/
@Override
protected String convertProperty(String propertyName, String propertyValue) {
// 检查该字段是否已经被加密
if (isEncryptProp(propertyName)) {
// 对已加密的字段进行解密工作
String decryptValue = DESUtil.getDecryptString(propertyValue);
// 返回揭秘后的字段
return decryptValue;
} else {
// 若没有进行加密则直接返回原字段个
return propertyValue;
}
}
/*
* 检查属性是否已经加密
*/
private boolean isEncryptProp(String propertyName) {
for (String encryptpropertyName : encryptPropNames) {
if (encryptpropertyName.equals(propertyName))
return true;
}
return false;
}
}
4.在spring-dao.xml配置文件中修改加载jdbc.propertie文件配置信息:
<!-- 1.配置数据库相关参数properties的属性:${url} -->
<!-- <context:property-placeholder location="classpath:jdbc.properties"/> -->
<bean class="com.imooc.o2o.util.EncryptPropertyPlaceholderConfigurer">
<!-- localtions:表示坐标 -->
<property name="locations">
<list>
<!-- 填写需要解密字段所在的文件夹,若有多个文件则可继续添加 -->
<value>classpath:jdbc.properties</value>
</list>
</property>
<!-- 指定上述文件的编码格式 -->
<property name="fileEncoding" value="UTF-8"/>
</bean>
以上便是对jdbc.peoperties文件的敏感信息的加密流程