I find back the configuration file encryption Java code. It is pretty easy to implement Passphase Based Encryption (PBE) in Java. I like to use XMLEncoder and XMLDecoder to write and read configuration file as it make simple code and good OO manner. However, XMLEncoder write Java object in a plain xml file. So, I create my own simple EncryptXMLEncoder and DecryptXMLDecoder to wrap around XMLEncoder and XMLDecoder. With EncryptXMLEncoder and DecryptXMLDecoder, I can write Java object into an encrypted file and read it back to a Java object.
These classes has potential to be expanded to be part of license manager. I will put my license manager design later. Also, I will implemented similar class in PHP later.
DummyDemo.java
package jia.blog.util.cfg;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import jia.blog.util.beans.DecryptedXMLDecoder;
import jia.blog.util.beans.EncryptedXMLEncoder;
/**
*
* @author Yiyu Jia
*/
public class DummyDemo {
static public void main(String argv[]) {
try {
//I use a simple DB configuration object for demo.
DBConfiguration db = new DBConfiguration();
db.setDbDriverName("com.mysql.jdbc.Driver");
db.setDbURI("jdbc:mysql://localhost:3306/jiaBlog");
db.setDbUser("yiyu.jia");
db.setDbPassword("****");
db.setDbPoolMinSize(1);
db.setDbPoolMaxSize(5);
//point out where the configuration file will be saved
FileOutputStream fos = new FileOutputStream(System.getProperty("user.dir") + File.separator + "cfg" + File.separator + "dbCfg.xml");
BufferedOutputStream bos = new BufferedOutputStream(fos);
//initialized an EcnryptedXMLEncoder with pass in passphase and salt string.
EncryptedXMLEncoder xmlEncoder = new EncryptedXMLEncoder(bos, "a complex password is a passphase", "put some salt for better taste");
//write the object to file. writing is down!
xmlEncoder.writeObject(db);
//point out where the configuration file will be read.
FileInputStream fis = new FileInputStream(System.getProperty("user.dir") + File.separator + "cfg" + File.separator + "dbCfg.xml");
//initialized an DecryptedXMLEncoder with pass in passphase string and salt string.
DecryptedXMLDecoder xmlDecoder = new DecryptedXMLDecoder(fis, "a complex password is a passphase", "put some salt for better taste");
DBConfiguration dbCfg = (DBConfiguration )xmlDecoder.readObject();
//let's see whether we get back the configuration correctly.
System.out.print(dbCfg.getDbDriverName() + "\n"
+ dbCfg.getDbUser() + "\n"
+ dbCfg.getDbPassword());
} catch (IOException ex) {
Logger.getLogger(DummyDemo.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(DummyDemo.class.getName()).log(Level.SEVERE, null, ex);
} finally {
}
}
}
EncryptedXMLEncoder.java
package jia.blog.util.beans;
import java.beans.XMLEncoder;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
*
* @author Yiyu Jia
*/
public class EncryptedXMLEncoder {
OutputStream out;
String passphase, salt;
public EncryptedXMLEncoder(OutputStream out, String passphase, String salt) {
this.out = out;
this.passphase = passphase;
this.salt = salt;
}
public void writeObject(Object o) throws IOException, Exception {
//I simply use ByteArrayOutputStream here.
//We can swith to piped stream if the object is really large.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLEncoder xmlEncoder = new XMLEncoder(baos);
xmlEncoder.writeObject(o);
xmlEncoder.close();
InputStream is =new ByteArrayInputStream(baos.toByteArray());
baos.close();
Encrypter.encryptOutput(passphase, salt, is, out);
}
}
DecryptedXMLDecoder.java
package jia.blog.util.beans;
import java.beans.XMLDecoder;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
/**
*
* @author Yiyu Jia
*/
public class DecryptedXMLDecoder {
InputStream in;
String passphase, salt;
public DecryptedXMLDecoder(InputStream in, String passphase, String salt) {
this.in = in;
this.passphase = passphase;
this.salt = salt;
}
public Object readObject() throws Exception {
//I simply use ByteArrayOutputStream here.
//We can swith to piped stream if the object is really large.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Encrypter.decryptInput(passphase, salt, in, baos );
InputStream is =new ByteArrayInputStream(baos.toByteArray());
XMLDecoder xmlDecoder = new XMLDecoder(is);
Object o = xmlDecoder.readObject();
xmlDecoder.close();
return o;
}
}
click here for netbean project files.

