Você está usando MD5 e Base64 encoder... O Base64 não deve ser usado dessa forma como criptografia pois ele só codifica (pode ser decodificado)...
Uma coisa legal que você pode fazer é usar o MD5 com um salt. Ou seja, você salga a String de uma forma que só você sabe como deve ser...
É uma forma de criptografia por obscuridade... Ou seja, alguém pode vir a descobrir, mas eu não me preocuparia com isso agora...
Essa aqui é uma forma de criptografia que usa o SHA-256 (parece o MD5, mas tem muito mais caracteres...)
Se você analisar, a forma que eu usei de "salgar" o meu valor é com o método shuffle e digest duas vezes... (linha 9)
public class Encrypter {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public String digest(String value) {
if (value == null)
throw new IllegalArgumentException("The value cannot be empty.");
return digest(shuffle(digest(shuffle(value))));
}
private String shuffle(String value) {
int length = value.length();
length = getMiddle(length);
return reverse(value.substring(0, length)).append(
reverse(value.substring(length))).toString();
}
private StringBuilder reverse(String value) {
return new StringBuilder(value).reverse();
}
private int getMiddle(int length) {
if (length % 2 == 1)
length = (length - 1) / 2;
else
length /= 2;
return length;
}
private String digest(String value) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(value.getBytes());
return byteToHex(md.digest());
} catch (NoSuchAlgorithmException e) {
logger.error("Unable to digest this value.", e);
return "";
}
}
private String byteToHex(byte[] bytes) {
if (bytes != null) {
StringBuilder s = new StringBuilder();
for (byte b : bytes) {
int high = ((b >> 4) & 0xf) << 4;
int low = b & 0xf;
if (high == 0)
s.append('0');
s.append(Integer.toHexString(high | low));
}
return s.toString();
}
return "";
}
Analise esse código e sinta-se livre para alterá-lo à sua necessidade... Se quiser fazer com o MD5, é só trocar nessa linha MessageDigest.getInstance("SHA-256" );