需求:实现数据库密码通过密文的方式存储在配置文件中
配置文件:evoucher.conf【可以是任意自定义格式结尾的配置文件】格式 是以 Key:Value存在的。
例如如下:
# evoucher.database 数据库配置
#####################################################################################################
# 'ORACLE'ORACLE数据库;'POSTGRES'postgreSql数据库;'DB2'DB2数据库;'SYBASE'sybase数据库;'UPDB'upRight数据库;'KB'kingBase数据库
evoucher.model.DataBaseService=ORACLE
#设置数据库用户名
evoucher.database.user=assp_pbc_1231
#设置数据库密码
evoucher.database.password=1
#设置数据库ip
evoucher.database.ip=192.168.1.241
#设置数据库端口
evoucher.database.port=1521
#数据库实例名oracle是实例名、postgres是数据库名
evoucher.database.databasename=orcl
##################oracle数据库URL配置 (当使用oracle数据库时,配置了URL则优先使用根据url配置的数据库,其他数据库无需配置)
##################如 jdbc:oracle:thin:@127.0.0.1:1521:orcl
evoucher.oracle.url=
#####################################################################################################
# evoucher.service.sign 签名服务配置
配置文件操作类:PropertiesHander.java
里面几个重要的方法:
saveNewPro:更新新的配置 更新配置
* 1.将更改后的配置文件保存在新的properties内2.初始化参数 将更改后的参数进行初始化3.更新缓存内的内容
getEVConfValue(String key)
setEVConfValue(HashMap<String,String> map)
Properties getProByCustomPath(String customPath,String fileName) { //获取自定义包路径的配置文件
List<String> readConfig(String fileURL) //读取配置文件 保留里面的注释信息
源文件如下:
/**
* 配置文件操作类
*
* @author leiruiheng
*
*/
public class PropertiesHander {
private static final Logger logger = Logger
.getLogger(PropertiesHander.class);
private static HashMap<String, String> File_MAPPINGS = new HashMap<String, String>();
private static Properties evoucherConfPro = PropertiesHander
.getProByCustomPath("/", BIZConstant.FILE_NAME_EVOUCHER_CONF);
static {
// 注册类字段与配置字段的映射关系
File_MAPPINGS.put("M_SIGN_SERVICE", "evoucher.model.SignService");
File_MAPPINGS.put("M_MESSAGE_SERVICE", "evoucher.model.MessageService");
File_MAPPINGS.put("M_ESTAMP_SERVICE", "evoucher.model.EStampService");
File_MAPPINGS.put("M_DATABASE_SERVICE",
"evoucher.model.DataBaseService");
File_MAPPINGS.put("M_CALL_BACK_PARAMETER",
"evoucher.service.callback.address");
File_MAPPINGS.put("M_REQUEST_NOTIFY", "evoucher.service.requestData.address");
File_MAPPINGS.put("M_CALL_BACK_THREAD_COUNT", "evoucher.service.callback.thread.count");
File_MAPPINGS.put("S_SIGN_SERVICE", "evoucher.switch.SignService");
File_MAPPINGS
.put("S_MESSAGE_SERVICE", "evoucher.switch.MessageService");
File_MAPPINGS.put("S_ESTAMP_SERVICE", "evoucher.switch.EStampService");
File_MAPPINGS.put("S_ESTAMP_ALLSIGN", "evoucher.switch.EStampAllSign");
File_MAPPINGS.put("S_ESTAMP_FUND", "evoucher.switch.EStampFund");
File_MAPPINGS.put("S_RECEIVE_VIERFY", "evoucher.switch.ReceiveVerfy");
File_MAPPINGS.put("S_READ_IS_RETURN", "evoucher.switch.IsReturn");
File_MAPPINGS.put("S_CHECK_IS", "evoucher.switch.VoucherFieldCheck");
File_MAPPINGS.put("S_CALL_BACK_FUNCTION",
"evoucher.switch.CallBackFuction");
File_MAPPINGS.put("S_ERROR_MSG_MODEL_FLAG", "evoucher.switch.ErrMsgModeFlag");
File_MAPPINGS.put("S_RECEIVE_MSG_REQUESTDATA_FLAG", "evoucher.switch.requestData");
File_MAPPINGS.put("S_RECEIVE_MSG_SENDDATA_FLAG", "evoucher.switch.sendData");
File_MAPPINGS.put("S_RECEIVE_MSG_SENDDATA_CALLBACK_FLAG", "evoucher.switch.sendData.CallBackFuncton");
File_MAPPINGS.put("S_AUTHENTICATEDUSERS", "evoucher.switch.AuthenticatedUsers");
File_MAPPINGS.put("S_TIMElOG_TEST", "evoucher.switch.TimeLog");
/** 凭证库服务版本号 */
File_MAPPINGS.put("EVOUCHER_SERVICE_VERSION", "evoucher.service.version");
//原文篡改编码
File_MAPPINGS.put("M_EVOUCHER_VERFIY_SIGN_CODE", "evoucher.verfiySignStamp.code");
//IP白名单控制
File_MAPPINGS.put("M_EVOUCHER_IP_WHITELIST_SERVER", "evoucher.ip.whiteList.server");
File_MAPPINGS.put("M_EVOUCHER_IP_WHITELIST_OCX", "evoucher.ip.whiteList.ocx");
File_MAPPINGS.put("S_CHECK_VOUCHERXMLFORXFIELD", "evoucher.switch.checkVoucherXmlForXField");
File_MAPPINGS.put("M_READ_VOUCHER_COUNT", "evoucher.service.read.voucher.count");
//校验内部凭证不能修改非空字段开关
File_MAPPINGS.put("S_CHECK_CANMODIFYNONEMPTYFIELDS","evoucher.switch.canModifyNonemptyFields");
//自动升级数据库开关
File_MAPPINGS.put("S_AUTO_UPDATEDB","evoucher.switch.autoUpdateDB");
}
/**
* 将更改后的参数保存在新的properties文件内
* @return null
* */
public static void saveNewPro(){
String fileUrl = PropertiesHander.class.getResource("/evoucher.conf").toString();
fileUrl = fileUrl.replace("file:","");
try {
//InputStream is1=PropertiesHander.class.getClassLoader().getResourceAsStream("evoucher.conf");
InputStream is = new FileInputStream(new File(fileUrl));
evoucherConfPro.clear();
evoucherConfPro.load(is);
} catch (IOException e) {
logger.error("文件加载异常", e);
}
}
public static String getEVConfValue(String key) {
if(File_MAPPINGS.containsKey(key))
key=File_MAPPINGS.get(key);
return evoucherConfPro.getProperty(key);
}
public static void setEVConfValue(HashMap<String,String> map){
OutputStream out = null;
OutputStreamWriter outFileWriter = null;
BufferedWriter br = null;
try {
String s=PropertiesHander.class.getResource("/evoucher.conf").toString();
s=s.replace("file:","");
List<String> list = PropertiesHander.readConfig(s);
out = new FileOutputStream(s);
outFileWriter = new OutputStreamWriter(out, "utf-8");
br = new BufferedWriter(outFileWriter);
for(String str : list){
if(str.contains("=")){
String[] array = str.split("=");
if(map.containsKey(array[0])){
str = array[0] + "=" + map.get(array[0]).trim();
}
}
br.write(str);
br.newLine();
}
} catch (Exception e) {
logger.error(e);
} finally{
try {
if(br != null){
br.close();
}
if(outFileWriter != null){
outFileWriter.close();
}
if(out != null){
out.close();
}
} catch (IOException e) {
logger.error(e);
}
}
}
/**
* 获取自定义包路径的配置文件
*
* @param customPath
* 自定义路径
* @param fileName
* 文件名
* @return
*/
public static Properties getProByCustomPath(String customPath,
String fileName) {
InputStream in = null;
Properties prop = new Properties();
try {
in = PropertiesHander.class.getResourceAsStream(customPath
+ fileName);
prop.load(in);
} catch (Exception e) {
throw new EVoucherException(ExceptionConstant.EVS601 + "获取文件["
+ fileName + "]失败", e);
} finally {
if (in != null)
try {
in.close();
} catch (IOException e) {
logger.warn("关闭流失败", e);
}
}
return prop;
}
/**
* 读取配置文件 保留里面的注释信息
* @param fileURL
* @author LY 2014-9-23
*/
private static List<String> readConfig(String fileURL) {
List<String> propCont = new ArrayList<String>();
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader bufferedreader = null;
try {
fis = new FileInputStream(fileURL);
isr = new InputStreamReader(fis, "utf-8");
bufferedreader = new BufferedReader(isr);
String temp = "";
while ((temp = bufferedreader.readLine()) != null) {
propCont.add(temp);
}
} catch (Exception e) {
logger.error(e);
} finally{
try {
if(bufferedreader != null){
bufferedreader.close();
}
if(isr != null){
isr.close();
}
if(fis != null){
fis.close();
}
} catch (IOException e) {
logger.error(e);
}
}
return propCont;
}
}
在类加载获取密码过程中:
//对数据库的密码进行加密处理
String pass=dealPassword(password);
方法体如下:
/**
* 处理密码 dealPassword 如果是明文 则加密 返回原密码
* 如果是密文 直接解密 返回解密后密码
* */
//对获取的密码进行解密
@SuppressWarnings("unchecked")
public String dealPassword(String password){
Des desObj=new Des();
String key1 = "lyn";
String key2 = "lyn";
String key3 = "lyn";
HashMap<String, String> map=new HashMap<String,String>();
if(password.length()<32){
//将字符串的密码长度增加至32位
String s="0000_"+password;
//对原文进行加密
String passWord = desObj.strEnc(s, key1, key2, key3);
//将加密后的参数传给配置文件更改配置文件中的信息 读取配置文件的信息
Properties evoucherPro = new Properties();
InputStream is=PropertiesHander.class.getClassLoader().getResourceAsStream("evoucher.conf");
try {
evoucherPro.load(is);
} catch (IOException e) {
// TODO Auto-generated catch block
logger.error("对密码加密时加载配置文件异常", e);
}
//将配置新的密码更新到配置文件中
evoucherPro.setProperty("evoucher.database.password", passWord);
//更新配置文件
Enumeration enmObject = evoucherPro.keys();
//对每一个主键信息进行检索处理,跟传入的返回值信息是否有相同的地方(如果有相同的地方,取出主键信息的属性,传回给返回信息)
while(enmObject.hasMoreElements()){
String Key = (String)enmObject.nextElement();
String Value = evoucherPro.getProperty(Key);
map.put(Key, Value);
}
PropertiesHander.setEVConfValue(map);
return password;
}
//解密
String newPassword1=desObj.strDec(password, key1, key2, key3);
String newPassword=newPassword1.substring(5);
return newPassword;
}
这里面用到了DES加密算法:
DES设计到Java版本和.js版本。参考资料如下源代码:http://download.csdn.net/detail/itjavawfc/8375329