mysql 密码文件改成密文_需求:实现数据库密码通过密文的方式存储在配置文件中 | 学步园...

需求:实现数据库密码通过密文的方式存储在配置文件中

配置文件: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 map)

Properties getProByCustomPath(String customPath,String fileName) {        //获取自定义包路径的配置文件

List readConfig(String fileURL)                        //读取配置文件  保留里面的注释信息

源文件如下:

/**

* 配置文件操作类

*

* @author leiruiheng

*

*/

public class PropertiesHander {

private static final Logger logger = Logger

.getLogger(PropertiesHander.class);

private static HashMap File_MAPPINGS = new HashMap();

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 map){

OutputStream out = null;

OutputStreamWriter outFileWriter = null;

BufferedWriter br = null;

try {

String s=PropertiesHander.class.getResource("/evoucher.conf").toString();

s=s.replace("file:","");

List 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 readConfig(String fileURL) {

List propCont = new ArrayList();

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 map=new HashMap();

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息安全的核心就是数据库的安全,也就是说数据库加密是信息安全的核心问题。数据库数据的安全问题越来越受到重视,数据库加密技术的应用极大的解决了数据库数据的安全问题,但实现方法各有侧重。 随着电子商务逐渐越来越多的应用,数据的安全问题越来越受到重视。一是企业本身需要对自己的关键数据进行有效的保护;二是企业从应用服务提供商(Application Service Provider,ASP)处获得应用支持和服务,在这种情况下,企业的业务数据放在ASP处,其安全性无法得到有效的保障。因为传统的数据库保护方式是通过设定口令字和访问权限等方法实现的,数据库管理员可以不加限制地访问和更改数据库的所有数据。解决这一问题的关键是要对数据本身加密,即使数据不幸泄露或丢失,也难以被人破译,关于这一点现基本数据库产品都支持对数据库的所有数据加密存储。 对数据进行加密,主要有三种方式:系统加密、客户端(DBMS外层)加密、服务器端(DBMS内核层)加密。客户端加密的好处是不会加重数据库服务器的负载,并且可实现网上的传输加密,这种加密方式通常利用数据库外层工具实现。而服务器端的加密需要对数据库管理系统本身进行操作,属核心层加密,如果没有数据库开发商的配合,其实现难度相对较大。此外,对那些希望通过ASP获得服务的企业来说,只有在客户端实现加解密,才能保证其数据的安全可靠。 1. 常用数据库加密技术 信息安全主要指三个方面。一是数据安全,二是系统安全,三是电子商务的安全。核心是数据库的安全,将数据库的数据加密就抓住了信息安全的核心问题。 对数据库数据加密是为增强普通关系数据库管理系统的安全性,提供一个安全适用的数据库加密平台,对数据库存储的内容实施有效保护。它通过数据库存储加密等安全方法实现数据库数据存储保密和完整性要求,使得数据库密文方式存储并在密态方式下工作,确保了数据安全。 1.1 数据库加密技术的功能和特性 经过近几年的研究,我国数据库加密技术已经比较成熟。 一般而言,一个行之有效的数据库加密技术主要有以下6个方面的功能和特性。 (1)身份认证: 用户除提供用户名、口令外,还必须按照系统安全要求提供其它相关安全凭证。如使用终端密钥。 (2) 通信加密与完整性保护: 有关数据库的访问在网络传输都被加密,通信一次一密的意义在于防重放、防篡改。 (3) 数据库数据存储加密与完整性保护: 数据库系统采用数据项级存储加密,即数据库不同的记录、每条记录的不同字段都采用不同的密钥加密,辅以校验措施来保证数据库数据存储的保密性和完整性,防止数据的非授权访问和修改。 (4) 数据库加密设置: 系统可以选择需要加密的数据库列,以便于用户选择那些敏感信息进行加密而不是全部数据都加密。只对用户的敏感数据加密可以提高数据库访问速度。这样有利于用户在效率与安全性之间进行自主选择。 (5)多级密钥管理模式: 主密钥和主密钥变量保在安全区域,二级密钥受主密钥变量加密保护,数据加密的密钥存储或传输时利用二级密钥加密保护,使用时受主密钥保护。 (6) 安全备份: 系统提供数据库明文备份功能和密钥备份功能。 1.2 对数据库加密系统基本要求 (1) 字段加密; (2) 密钥动态管理; (3) 合理处理数据; (4) 不影响合法用户的操作; (5) 防止非法拷贝; 1.3 数据加密的算法 加密算法是一些公式和法则,它规定了明文和密文之间的变换方法。密钥是控制加密算法和解密算法的关键信息,它的产生、传输、存储等工作是十分重要的。 数据加密的基本过程包括对明文(即可读信息)进行翻译,译成密文密码的代码形式。该过程的逆过程为解密,即将该编码信息转化为其原来的形式的过程。 DES算法, DES(Data Encryption Standard)是由IBM公司在1970年以后发展起来的,于1976年11月被美国政府采用,DES随后被美国国家标准局和美国国家标准协会(American National Standard Institute,ANSI)承认, DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,DES算法只用到64位密钥的其56位。 三重DES, DES的密码学缺点是密钥长度相对比较短,因此,人们又想出了一个解决其长度的方法,即采用三重DES,三重DES是DES的一种变形。这种方法使用两个独立的56位密钥对交换的信息(如EDI数据)进行3次加密,从而使其有效密钥长度达到112位或168位, 对安全性有特殊要求时则要采用它。 RSA算法它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字就是发明者的名字:Ron Rivest, AdiShamir 和Leonard Adleman, 但RSA的安全性一直未能得到理论上的证明, RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题, RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。 AES是美国高级加密标准算法,将在未来几十年里代替DES在各个领域得到广泛应用,尽管人们对AES还有不同的看法,但总体来说,AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES设计有三个密钥长度:128,192,256位,相对而言,AES的128密钥比DES的56密钥强1021倍。AES算法主要包括三个方面:轮变化、圈数和密钥扩展。在理论上,此加密方法需要国家军事量级的破解设备运算10年以上时间才可能破译。 1.4 数据库数据加密的实现 使用数据库安全保密间件对数据库进行加密是最简便直接的方法。主要是通过系统加密、DBMS内核层(服务器端)加密和DBMS外层(客户端)加密。 在系统加密,在系统无法辨认数据库文件的数据关系,将数据先在内进行加密,然后文件系统把每次加密后的内数据写入到数据库文件去,读入时再逆方面进行解密就,这种加密方法相对简单,只要妥善管理密钥就可以了。缺点对数据库的读写都比较麻烦,每次都要进行加解密的工作,对程序的编写和读写数据库的速度都会有影响。 在DBMS内核层实现加密需要对数据库管理系统本身进行操作。这种加密是指数据在物理取之前完成加解密工作。这种加密方式的优点是加密功能强,并且加密功能几乎不会影响DBMS的功能,可以实现加密功能与数据库管理系统之间的无缝耦合。其缺点是加密运算在服务器端进行,加重了服务器的负载,而且DBMS和加密器之间的接口需要DBMS开发商的支持。 在DBMS外层实现加密的好处是不会加重数据库服务器的负载,并且可实现网上的传输,加密比较实际的做法是将数据库加密系统做成DBMS的一个外层工具,根据加密要求自动完成对数据库数据的加解密处理。 采用这种加密方式进行加密,加解密运算可在客户端进行,它的优点是不会加重数据库服务器的负载并且可以实现网上传输的加密,缺点是加密功能会受到一些限制,与数据库管理系统之间的耦合性稍差。 数据库加密系统分成两个功能独立的主要部件:一个是加密字典管理程序,另一个是数据库加解密引擎。数据库加密系统将用户对数据库信息具体的加密要求以及基础信息保在加密字典,通过调用数据加解密引擎实现数据库表的加密、解密及数据转换等功能。数据库信息的加解密处理是在后台完成的,对数据库服务器是透明的。 按以上方式实现数据库加密系统具有很多优点:首先,系统对数据库的最终用户是完全透明的,管理员可以根据需要进行明文和密文的转换工作;其次,加密系统完全独立于数据库应用系统,无须改动数据库应用系统就能实现数据加密功能;第三,加解密处理在客户端进行,不会影响数据库服务器的效率。 数据库加解密引擎是数据库加密系统的核心部件,它位于应用程序与数据库服务器之间,负责在后台完成数据库信息的加解密处理,对应用开发人员和操作人员来说是透明的。数据加解密引擎没有操作界面,在需要时由操作系统自动加载并驻留在内,通过内部接口与加密字典管理程序和用户应用程序通讯。数据库加解密引擎由三大模块组成:加解密处理模块、用户接口模块和数据库接口模块。 2. 结束语 上面的论述还远远没达到数据库安全需要,比如现在的数据库基本都基于网络架构,网际的安全传输等,也是要重点考虑的方面。一个好的安全系统必须综合考虑核运用这些技术,以保证数据的安全,通过以上论述希望对大家有所帮助,同时也和大家一起讨论一起学习,共同进步。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值