- 浏览: 639535 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
liuche20083736:
非常好
从问题看本质: 研究TCP close_wait的内幕 -
xiaopohai85707:
优化算法与原来需求不符
过滤字符的性能调优?挤一挤还是有的 -
kmy_白衣:
生成的area图有时候 标签的数值和图标上看上去的数值不一致。 ...
OpenFlashChart2之恶心文档 -
tom&jerry:
大神,请教一个问题,按名称排序为何无效,用的2.4.3 XPA ...
深入浅出jackrabbit之十三 查询之AST和QT -
jd2bs:
改成精确匹配可以了< filter-mapping &g ...
细谈Ehcache页面缓存的使用
如何给工程中的配置文件加密 解密
之前有人问过hibernate密码问题,大家都没有给出一个具体的解决方案,所以我就看了一下代码,把我的想法和实现拿出来和大家讨论一下。
我现在的环境是spring+hibernate,但是这并不影响这个加密解密的问题,其他环境应该是略有不同,但是思路肯定是一样的。
总体思路:在工程的配置文件中填写数据库密码的密文,在应用程序使用datasource的时候解密成明文以创建连接。
步骤1
使用java的中cipher类并使用DES(对称加密算法)算法对明文进行加密
````````````````这里如何使用cipher类和DES算法的原理可以上网查找,我懒得写了,如果大家真的也怕麻烦自己去找的话我再写一个贴出来吧
修改:我随便写了一个类,大家看着改吧,我没有测试过
通过以上的encrypt方法得到一个密码的密文(一般的密码是明文,作为参数传进去可以得到对应的密文),比如说21sadf25
步骤2
将加密后的密文添加到配置文件中
步骤3
继承spring的LocalSessionFactoryBean类,override其setDataSource方法,将dataSource的password取出,解密后再赋值。
为什么要这么做呢,因为datasource是localsessionFactoryBean的一个属性,在注入dataSource时将其密码解密是比较恰当的。所以选择这个setDataSource方法进行override。假设我们使用的dbcp连接池
代码如下:(类名是AhuaXuanLocalSessionFactoryBean)
这样就完成了一个我们的目标,以上代码是随便写的,没有经过测试,有兴趣的同学可以试一下
作者:张荣华,未经作者同意不得随意转载!
你看了加密之后的配置文件,你能干什么?
to楼下
你如何得到admin的权利,你得到服务器的admin权利后你如何重置数据库密码,
有一点你要知道jboss天生就支持这样做,你可以到论坛上搜一下。
如果你对某个事物不是很了解最好是先研究再发言
你发布工程的时候不能混淆一下吗,我还没有见不在代码中读取密码的安全应用呢
之前有人问过hibernate密码问题,大家都没有给出一个具体的解决方案,所以我就看了一下代码,把我的想法和实现拿出来和大家讨论一下。
我现在的环境是spring+hibernate,但是这并不影响这个加密解密的问题,其他环境应该是略有不同,但是思路肯定是一样的。
总体思路:在工程的配置文件中填写数据库密码的密文,在应用程序使用datasource的时候解密成明文以创建连接。
步骤1
使用java的中cipher类并使用DES(对称加密算法)算法对明文进行加密
````````````````这里如何使用cipher类和DES算法的原理可以上网查找,我懒得写了,如果大家真的也怕麻烦自己去找的话我再写一个贴出来吧
修改:我随便写了一个类,大家看着改吧,我没有测试过
public class DESUtil { public static void main(String[] args){ try { if(args[0].equals("-genKey")){ generateKey(args[1]); }else{ //if (args[0].equals("-encrypt"))encrypt(); //else decrypt(); } }catch (Exception e) { // TODO: handle exception } } public static String encrypt(String plainText, String encryptString, File keyFile)throws IOException, ClassNotFoundException,GeneralSecurityException{ ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(keyFile)); int mode = Cipher.ENCRYPT_MODE; Key key = (Key)keyIn.readObject(); keyIn.close(); InputStream in = new FileInputStream(plainText); OutputStream out = new FileOutputStream(encryptString); Cipher cipher = Cipher.getInstance("DES"); cipher.init(mode, key); doEncryptAndDecrypt(in, out, cipher); String result = out.toString(); System.out.print(result); in.close(); out.close(); return result; } public static String decrypt(String encryptString, String plainText, File keyFile)throws IOException, ClassNotFoundException,GeneralSecurityException{ ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(keyFile)); int mode = Cipher.DECRYPT_MODE; Key key = (Key)keyIn.readObject(); keyIn.close(); InputStream in = new FileInputStream(encryptString); OutputStream out = new FileOutputStream(plainText); Cipher cipher = Cipher.getInstance("DES"); cipher.init(mode, key); doEncryptAndDecrypt(in, out, cipher); String result = out.toString(); System.out.print(result); in.close(); out.close(); return result; } public static void doEncryptAndDecrypt(InputStream in, OutputStream out, Cipher cipher)throws IOException, GeneralSecurityException{ int blockSize = cipher.getBlockSize(); int outputSize = cipher.getOutputSize(blockSize); byte[] inBytes = new byte[blockSize]; byte[] outBytes = new byte[outputSize]; int inLength = 0; boolean more = true; while(more){ inLength = in.read(inBytes); if(inLength == blockSize){ int outLength = cipher.update(inBytes, 0, blockSize, outBytes); out.write(outBytes,0,outLength); } else more = false; } if(inLength>0) outBytes = cipher.doFinal(inBytes, 0, inLength); else outBytes = cipher.doFinal(); out.write(outBytes); } public static void generateKey(String path) throws Exception{ KeyGenerator keygen = KeyGenerator.getInstance("DES"); SecureRandom random = new SecureRandom(); keygen.init(random); SecretKey key = keygen.generateKey(); ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(path)); out.writeObject(key); out.close(); } }
通过以上的encrypt方法得到一个密码的密文(一般的密码是明文,作为参数传进去可以得到对应的密文),比如说21sadf25
步骤2
将加密后的密文添加到配置文件中
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/> <property name="url" value="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true"/> <property name="username" value="root"/> <property name="password" value="21sadf25"/> <property name="maxActive" value="100"/> <property name="whenExhaustedAction" value="1"/> <property name="maxWait" value="120000"/> <property name="maxIdle" value="30"/> <property name="defaultAutoCommit" value="true"/> </bean>
步骤3
继承spring的LocalSessionFactoryBean类,override其setDataSource方法,将dataSource的password取出,解密后再赋值。
为什么要这么做呢,因为datasource是localsessionFactoryBean的一个属性,在注入dataSource时将其密码解密是比较恰当的。所以选择这个setDataSource方法进行override。假设我们使用的dbcp连接池
代码如下:(类名是AhuaXuanLocalSessionFactoryBean)
public void setDataSource(DataSource dataSource) { String password = (BasicDataSource)dataSource.getPassword(); //通过cipher类进行解密 String decryPassword = DESUtil.decrypt(password); dataSource.setPassword(decryPassword); this.dataSource = dataSource; }配置如下:
<bean id="sessionFactory" class="org.springframework.orm.hibernate.AhuaXuanLocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean>之前robbin说的DataSourceFactoryBean那个类我在spring1.2.8中没有找到,但是我觉得改造LocalSessionFactoryBean也不错
这样就完成了一个我们的目标,以上代码是随便写的,没有经过测试,有兴趣的同学可以试一下
作者:张荣华,未经作者同意不得随意转载!
评论
11 楼
chinayx
2007-06-21
得到服务器admin权利后,直接重置数据库密码呢?
对服务器段程序,有必要做得这么麻烦吗?
对服务器段程序,有必要做得这么麻烦吗?
10 楼
ahuaxuan
2007-06-04
Michael.zhl 写道
没必要吧,人家要是连你的配置文件都看了.还有什么干不了呢.安全问题应该从服务器整体考虑.
你看了加密之后的配置文件,你能干什么?
to楼下
chinayx 写道
得到服务器admin权利后,直接重置数据库密码呢?
对服务器段程序,有必要做得这么麻烦吗?
对服务器段程序,有必要做得这么麻烦吗?
你如何得到admin的权利,你得到服务器的admin权利后你如何重置数据库密码,
有一点你要知道jboss天生就支持这样做,你可以到论坛上搜一下。
如果你对某个事物不是很了解最好是先研究再发言
9 楼
Michael.zhl
2007-06-04
没必要吧,人家要是连你的配置文件都看了.还有什么干不了呢.安全问题应该从服务器整体考虑.
8 楼
抛出异常的爱
2007-05-29
加密的作用就是让黑客一次破解的周期延长。。。。并提高发现可能
而不是为了让他破不开。。。
至少要大于24小时。。。
那样的话。。。不用24小时守着电脑了。
而不是为了让他破不开。。。
至少要大于24小时。。。
那样的话。。。不用24小时守着电脑了。
7 楼
spiritfrog
2007-05-29
这样也足够用了,加密过的密码放在配置文件中,就算看得到有什么关系呢?
这里讨论的也不是加密的方案如何如何安全可靠,重点还是能够在创建datasource的时候得到正确的密码明文, 黑客入侵就扯得远了嘛.
这里讨论的也不是加密的方案如何如何安全可靠,重点还是能够在创建datasource的时候得到正确的密码明文, 黑客入侵就扯得远了嘛.
6 楼
ahuaxuan
2007-04-23
小开ye 写道
我还记得四年前我想通过一些非常手法来获取数据库的口令,却被一个同事批评了一通,他说,既然是bs模式,就没有必要在服务器上去加密数据库口令了;因为如果有人能进入服务器了,你还能阻止他什么?
能入侵服务器的黑客就一定能知道服务器上数据的密码吗,他可以在应用程序的配置文件中找数据库密码,如果应用程序的数据库password被保护了,至少在一定程度上阻止了他的步伐,如果他水平很高,对加密解密很了解,说不定能破解(或者用其他什么工具直接破解数据库密码,我猜的),但前提的他是黑客中的高手,但是事实告诉我们黑客中的菜鸟也不少,只会用点小工具去扫描扫描端口等等,不同的客户不同的应用是需要不同的安全级别的
5 楼
remanhu
2007-04-17
用jndi是最安全的,其它方式都可能有问题,即使是通过混淆代码,一样是有办法解开的
4 楼
weiqingfei
2007-04-17
可以参考一下.net配置文件的加密方式,把加密解密委托给别的程序。
3 楼
小开ye
2007-04-16
我还记得四年前我想通过一些非常手法来获取数据库的口令,却被一个同事批评了一通,他说,既然是bs模式,就没有必要在服务器上去加密数据库口令了;因为如果有人能进入服务器了,你还能阻止他什么?
当然日常的安全性我们还是需要考虑的。
当然日常的安全性我们还是需要考虑的。
2 楼
jamesby
2007-04-13
我在想一个问题,能不能想办法对setPassword方法进行拦截器拦截,这样一来任何需要加密的地方都拦截一下就可以了.
1 楼
ahuaxuan
2007-04-13
lixuehui 写道
没觉得安全性高在哪,真实密码照样在程序中出现.
很容易就被破解了,照样可以得到数据库的真实密码
不可取
很容易就被破解了,照样可以得到数据库的真实密码
不可取
你发布工程的时候不能混淆一下吗,我还没有见不在代码中读取密码的安全应用呢
发表评论
-
过滤字符的性能调优?挤一挤还是有的
2010-05-29 05:54 3610/* *auth ... -
Master-Slave,Spring,Hibernate,故事曲折离奇,情结跌宕起伏
2009-02-05 13:49 8683/** *作者:张荣华 *日期 ... -
弃成见,反省,并重新认识struts.i18n.encoding
2008-12-24 15:42 3880[size=medium]之前和大家讨论了struts2.0中 ... -
关键字:查询,事务,粒度
2008-08-22 17:05 5137[size=medium]/** *作者: ... -
看看mina和memcached的联姻(适合不同语言客户端,高并发?)
2008-07-21 17:06 7983[size=medium]/** * 作者:张荣华 * 日 ... -
如何解决mysql的master-slave模式中ReplicationDriver的使用问题
2008-06-19 18:23 8219/** * 作者:张荣华 * 日期:2008-6-19 ... -
别装了,难道你们不想把properties直接注入到object中去(spring-plugin)?
2008-04-09 18:01 3650[size=small]/** *作者:张荣华(ahuaxu ... -
用jamon来监控你的sql执行效率
2008-02-25 15:48 3715/** *作者:张荣华 *日期:2008-2-25 ... -
java同msn的通信,大家想想用途吧
2007-11-24 17:14 2512程序员的生活真是单调,除了编程还是编程,工作日 ... -
EAI企业应用集成场景及解决方案
2007-09-21 18:21 3153/** *作者:张荣华(ahuaxuan) *2007-9 ... -
quartz和应用的集群问题
2007-08-21 18:36 12817之前看到很多关于quartz的讨论,尤其是关于quar ... -
优化程序之前,可用Jamon来监测你的Spring应用
2007-08-14 18:14 8124/** *作者:张荣华(ahuaxuan) *2007-8-1 ... -
请问责任链真的是一种设计模式吗
2007-07-26 18:12 9412坛子上讨论设计模式的也挺多的,但是关于这个责任链模式还没有人提 ... -
把ActiveMQ的控制台整合到你的web程序中
2007-07-19 12:06 8829在使用ActiveMQ的时候把ActiveMQ的控制台整 ... -
设计模式之:解剖观察者模式
2007-07-17 16:12 6866[size=9] 论坛上很多人都 ... -
java邮件:在简单和复杂之间的方案
2007-07-11 18:07 7583/** *作者:张荣华(ahuaxu ... -
强强连手, 在模板中分页,看Freemarker和displaytag的结合
2007-07-09 09:22 6925/** *作者:张荣华(ahuaxuan) *2007-0 ... -
解惑:在spring+hibernate中,只读事务是如何被优化的。
2007-06-28 18:22 7620/** *作者:张荣华(ahuaxuan) *2007- ... -
让webwork零配置 第二章(实现)(实例已放出,大家可以下载运行)
2007-06-25 09:23 5707/** *作者:张荣华(ahuaxuan) *2007-0 ... -
让webwork2零配置,第一章(主贴再次更新)
2007-06-18 15:41 13378/** *作者:张荣华(ahuaxuan) *2007-0 ...
相关推荐
Hibernate 配置文件加密解密方案 在本文中,我们将讨论如何在 Hibernate 配置文件中对数据库密码进行加密和解密,以保护数据的安全。该方案通过使用 Java 的 Cipher 类和 DES 对称加密算法来实现加密和解密操作。 ...
在这个"jasypt加密_spring整合.zip"压缩包中,我们将会探讨如何将Jasypt与Spring框架整合,以便在Hibernate配置文件中安全地存储敏感信息。 首先,Jasypt提供了两种主要的加密模式:强加密(Strong Encryption)和...
Proxool的加密功能允许我们在配置中使用加密的用户名和密码,确保即使配置文件被泄露,攻击者也无法直接获取到明文的数据库凭据。这增强了系统的安全性,降低了数据泄露的风险。 在提供的压缩包文件中,可能包含了...
Hibernate 3.3 对 Java 5 的注解支持进行了强化,允许开发者在实体类和属性上直接使用注解来定义数据库映射,减少了XML配置文件的使用。这使得代码更加简洁,提高了开发效率。 2. **Criteria 查询API增强**: 新...
3. 数据源设置:创建一个自定义的数据源,用于处理SQLCipher的加密解密逻辑。在连接数据库时,需要将密码传递给SQLCipher,以便正确地打开和操作加密的SQLite数据库。 4. 修改数据库操作:在Hibernate的...
SSH的主要配置文件在Unix/Linux系统中通常是`/etc/ssh/sshd_config`(服务器端)和`~/.ssh/config`(客户端)。这些文件中包含了SSH服务的各种设置,如端口号、加密算法、身份验证方法等。 - `sshd_config`文件:...
数据库连接池的配置中,通常会在配置文件(如XML或properties文件)中写入加密后的密码。在应用启动时,会读取这个加密后的密码,然后进行解密操作,与用户输入的明文密码进行比对。具体的解密过程取决于加密策略,...
- 在Hibernate配置文件中(如`hibernate.cfg.xml`): ```xml jasypt.hibernate.connectionprovider.EncryptedPasswordDriverManagerConnectionProvider <property name="connection.password">ENC(G6N718...
例如,你可以使用`EncryptedPropertyPlaceholderConfigurer`来加密和解密Spring配置文件中的属性值。 2. **集成友好:** Jasypt可以无缝集成到各种Java应用框架中,如Spring、Hibernate等,为这些框架提供了加密...
系统采用SpringMVC整合Hibernate,前端采用Jquery的miniUI做简单展示,集合了常用的web程序功能,增删改查,分页,上传文件,下载文件,freemark导出word,导出excel,spring定时器(三种配置写法都有简单介绍),...
对于整个数据库的加密,可能需要利用数据库管理系统(如MySQL的TDE,Transparent Data Encryption)提供的特性,设置加密策略,并配置加密密钥管理。 3. **Java与数据库的交互** Java中的JDBC提供了一套标准接口...
- `security`:涉及安全性的代码,如权限控制、加密解密等。 - `service`:业务逻辑层,处理应用的核心业务。 - `servlet`:存放公共Servlet,处理HTTP请求。 - `utils`:工具类集合,包含各种通用操作方法。 -...
使用Spring的JUnit支持,开发者可以编写测试用例,确保登录功能的正确性,包括验证用户的合法性、检查密码加密解密是否正确以及权限控制是否到位。 综上所述,"Struts+Spring+Hibernate" 登录系统整合了三个强大的...
6. 配置文件:包括Spring的bean配置文件、Struts2的动作配置文件以及Hibernate的实体映射文件。 登录功能通常涉及用户的验证,这需要在Service层实现,可能包括从数据库中查询用户信息、密码加密解密等步骤。此外,...
当用户尝试连接时,服务器会用公钥加密一个随机数并发送给客户端,客户端使用私钥解密,然后用解密后的数字回传给服务器,证明它持有正确的私钥,从而完成身份验证。 配置SSH涉及到以下几个关键步骤: 1. **生成...
这个"SSM整合demo"是一个示例项目,旨在展示如何将这三个框架有效地结合在一起,同时还实现了一些进阶功能,如自动分页、非实体类校验、异常处理、事务管理和数据库配置文件加密。 首先,Spring是核心容器,负责...
>Jasypt是一个Java库,可以使开发者不需太多操作来给Java项目添加基本加密功能,而且不需要知道加密原理。 >根据Jasypt官方文档,Jasypt可用于加密任务与应用程序,例如加密密码、敏感信息和数据通信、创建完整检查...
5. **配置文件**:SSH框架的配置文件包括struts.xml(Struts2配置)、spring-context.xml(Spring配置)和hibernate.cfg.xml(Hibernate配置)。这些文件定义了组件间的依赖、Action的映射、数据源和实体类的映射等...
1. **实例化DAO**:在服务启动时,根据配置文件(如Hibernate的.cfg.xml或MyBatis的mybatis-config.xml)加载数据库连接信息,并创建DAO实例。 2. **调用DAO**:当用户请求获取产品信息时,系统识别到需要调用DAO。...