问题描述
转自:http://www.javaeye.com/topic/70663如何给工程中的配置文件加密解密之前有人问过hibernate密码问题,大家都没有给出一个具体的解决方案,所以我就看了一下代码,把我的想法和实现拿出来和大家讨论一下。我现在的环境是spring+hibernate,但是这并不影响这个加密解密的问题,其他环境应该是略有不同,但是思路肯定是一样的。总体思路:在工程的配置文件中填写数据库密码的密文,在应用程序使用datasource的时候解密成明文以创建连接。步骤1使用java的中cipher类并使用DES(对称加密算法)算法对明文进行加密````````````````这里如何使用cipher类和DES算法的原理可以上网查找,我懒得写了,如果大家真的也怕麻烦自己去找的话我再写一个贴出来吧修改:我随便写了一个类,大家看着改吧,我没有测试过Java代码publicclassDESUtil{publicstaticvoidmain(String[]args){try{if(args[0].equals("-genKey")){generateKey(args[1]);}else{//if(args[0].equals("-encrypt"))encrypt();//elsedecrypt();}}catch(Exceptione){//TODO:handleexception}}publicstaticStringencrypt(StringplainText,StringencryptString,FilekeyFile)throwsIOException,ClassNotFoundException,GeneralSecurityException{ObjectInputStreamkeyIn=newObjectInputStream(newFileInputStream(keyFile));intmode=Cipher.ENCRYPT_MODE;Keykey=(Key)keyIn.readObject();keyIn.close();InputStreamin=newFileInputStream(plainText);OutputStreamout=newFileOutputStream(encryptString);Ciphercipher=Cipher.getInstance("DES");cipher.init(mode,key);doEncryptAndDecrypt(in,out,cipher);Stringresult=out.toString();System.out.print(result);in.close();out.close();returnresult;}publicstaticStringdecrypt(StringencryptString,StringplainText,FilekeyFile)throwsIOException,ClassNotFoundException,GeneralSecurityException{ObjectInputStreamkeyIn=newObjectInputStream(newFileInputStream(keyFile));intmode=Cipher.DECRYPT_MODE;Keykey=(Key)keyIn.readObject();keyIn.close();InputStreamin=newFileInputStream(encryptString);OutputStreamout=newFileOutputStream(plainText);Ciphercipher=Cipher.getInstance("DES");cipher.init(mode,key);doEncryptAndDecrypt(in,out,cipher);Stringresult=out.toString();System.out.print(result);in.close();out.close();returnresult;}publicstaticvoiddoEncryptAndDecrypt(InputStreamin,OutputStreamout,Ciphercipher)throwsIOException,GeneralSecurityException{intblockSize=cipher.getBlockSize();intoutputSize=cipher.getOutputSize(blockSize);byte[]inBytes=newbyte[blockSize];byte[]outBytes=newbyte[outputSize];intinLength=0;booleanmore=true;while(more){inLength=in.read(inBytes);if(inLength==blockSize){intoutLength=cipher.update(inBytes,0,blockSize,outBytes);out.write(outBytes,0,outLength);}elsemore=false;}if(inLength>0)outBytes=cipher.doFinal(inBytes,0,inLength);elseoutBytes=cipher.doFinal();out.write(outBytes);}publicstaticvoidgenerateKey(Stringpath)throwsException{KeyGeneratorkeygen=KeyGenerator.getInstance("DES");SecureRandomrandom=newSecureRandom();keygen.init(random);SecretKeykey=keygen.generateKey();ObjectOutputStreamout=newObjectOutputStream(newFileOutputStream(path));out.writeObject(key);out.close();}}publicclassDESUtil{publicstaticvoidmain(String[]args){try{if(args[0].equals("-genKey")){generateKey(args[1]);}else{//if(args[0].equals("-encrypt"))encrypt();//elsedecrypt();}}catch(Exceptione){//TODO:handleexception}}publicstaticStringencrypt(StringplainText,StringencryptString,FilekeyFile)throwsIOException,ClassNotFoundException,GeneralSecurityException{ObjectInputStreamkeyIn=newObjectInputStream(newFileInputStream(keyFile));intmode=Cipher.ENCRYPT_MODE;Keykey=(Key)keyIn.readObject();keyIn.close();InputStreamin=newFileInputStream(plainText);OutputStreamout=newFileOutputStream(encryptString);Ciphercipher=Cipher.getInstance("DES");cipher.init(mode,key);doEncryptAndDecrypt(in,out,cipher);Stringresult=out.toString();System.out.print(result);in.close();out.close();returnresult;}publicstaticStringdecrypt(StringencryptString,StringplainText,FilekeyFile)throwsIOException,ClassNotFoundException,GeneralSecurityException{ObjectInputStreamkeyIn=newObjectInputStream(newFileInputStream(keyFile));intmode=Cipher.DECRYPT_MODE;Keykey=(Key)keyIn.readObject();keyIn.close();InputStreamin=newFileInputStream(encryptString);OutputStreamout=newFileOutputStream(plainText);Ciphercipher=Cipher.getInstance("DES");cipher.init(mode,key);doEncryptAndDecrypt(in,out,cipher);Stringresult=out.toString();System.out.print(result);in.close();out.close();returnresult;}publicstaticvoiddoEncryptAndDecrypt(InputStreamin,OutputStreamout,Ciphercipher)throwsIOException,GeneralSecurityException{intblockSize=cipher.getBlockSize();intoutputSize=cipher.getOutputSize(blockSize);byte[]inBytes=newbyte[blockSize];byte[]outBytes=newbyte[outputSize];intinLength=0;booleanmore=true;while(more){inLength=in.read(inBytes);if(inLength==blockSize){intoutLength=cipher.update(inBytes,0,blockSize,outBytes);out.write(outBytes,0,outLength);}elsemore=false;}if(inLength>0)outBytes=cipher.doFinal(inBytes,0,inLength);elseoutBytes=cipher.doFinal();out.write(outBytes);}publicstaticvoidgenerateKey(Stringpath)throwsException{KeyGeneratorkeygen=KeyGenerator.getInstance("DES");SecureRandomrandom=newSecureRandom();keygen.init(random);SecretKeykey=keygen.generateKey();ObjectOutputStreamout=newObjectOutputStream(newFileOutputStream(path));out.writeObject(key);out.close();}}通过以上的encrypt方法得到一个密码的密文(一般的密码是明文,作为参数传进去可以得到对应的密文),比如说21sadf25