package com.googlecode.tawus.hibernate.utils; import java.io.Serializable; import java.math.BigInteger; import java.security.MessageDigest; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.usertype.UserType; public class MD5SumType implements UserType { @Override public int [] sqlTypes(){ return new int []{ Types.VARCHAR }; } @Override @SuppressWarnings("rawtypes") public Class returnedClass(){ return String.class; } @Override public boolean equals(Object x, Object y) throws HibernateException { return (x == y) || (x != null && y != null && x.equals(y)); } @Override @SuppressWarnings("deprecation") public Object nullSafeGet(final ResultSet rs, final String [] names, final Object owner) throws HibernateException, SQLException { final String val = (String)Hibernate.STRING.nullSafeGet(rs, names[0]); return val == null ? null: val.trim(); } @Override public Object replace(Object original, Object target, Object owner) throws HibernateException{ return original; } @Override @SuppressWarnings("deprecation") public void nullSafeSet(final PreparedStatement ps, Object value, int index) throws HibernateException, SQLException { String password = null; if(value != null){ password = encrypt((String)value); } Hibernate.STRING.nullSafeSet(ps, password, index); } @Override public Object deepCopy(Object value) throws HibernateException { if(value == null){ return null; } return new String((String)value); } @Override public boolean isMutable(){ return true; } @Override public Serializable disassemble(Object value) throws HibernateException{ return (Serializable)value; } @Override public Object assemble(Serializable cached, Object owner) throws HibernateException{ return cached; } @Override public int hashCode(Object x) throws HibernateException{ return x.hashCode(); } private String encrypt(String plainText) throws HibernateException { if(plainText.length() == 32){ return plainText; } try { final MessageDigest md = MessageDigest.getInstance("MD5"); md.reset(); String clearPassword = plainText; md.update(clearPassword.getBytes("UTF-8")); BigInteger hash = new BigInteger(1, md.digest()); return pad(hash.toString(16),32,'0'); }catch(Exception ex){ throw new HibernateException(ex.getMessage(), ex); } } private String pad(String s, int length, char pad) { StringBuffer buffer = new StringBuffer(s); while (buffer.length() < length) { buffer.insert(0, pad); } return buffer.toString(); } }