У меня есть простое веб-приложение на Java, созданное Apache Wicket. Когда я регистрирую пользователей в веб-приложении, я шифрую пароль, который они вводят, используя тройки, и сохраняю его в базу данных. На странице входа в систему, когда они вводят один и тот же пароль, я шифрую его и передаю зашифрованный пароль в БД, чтобы проверить, верен ли он.
Сейчас я работаю над созданием приложения для Android, которое будет иметь те же функции входа в систему.
На странице входа в приложение Android я использую одну и ту же библиотеку шифрования для шифрования пароля и использую один и тот же ключ и вектор инициализации для обеих платформ, но если я пытаюсь ввести одну и ту же строку пароля в Android, алгоритм TripleDes генерирует совершенно разные зашифрованные пароль (намного дольше). И, следовательно, вход не удается с устройства Android Я также заметил, что зашифрованный пароль, который генерирует Android, не может быть расшифрован, он выдает исключение.
Я думаю, что между двумя платформами может существовать разница между строковым кодированием, но я не могу понять, что является причиной и как это исправить.
Вот алгоритм, который я использую:
public class TripleDES {
private String key;
private byte[] initializationVector;
public TripleDES(String key, byte[] initializationVector)
{
this.key = key;
this.initializationVector = initializationVector;
}
public String encryptText(String plainText) throws Exception{
//---- Use specified 3DES key and IV from other source -------------------------
byte[] plaintext = plainText.getBytes();
byte[] tdesKeyData = key.getBytes();
System.out.println("plain text length: " + plaintext.length);
System.out.println("key length: " + tdesKeyData.length);
Cipher c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede");
IvParameterSpec ivspec = new IvParameterSpec(initializationVector);
c3des.init(Cipher.ENCRYPT_MODE, myKey, ivspec);
byte[] cipherText = c3des.doFinal(plaintext);
return Base64Coder.encodeString(new String(cipherText));
}
public String decryptText(String encryptedText) throws Exception{
//---- Use specified 3DES key and IV from other source -------------------
byte[] enctext = Base64Coder.decode(encryptedText);
byte[] tdesKeyData = key.getBytes();
Cipher c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding");
SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede");
IvParameterSpec ivspec = new IvParameterSpec(initializationVector);
c3des.init(Cipher.DECRYPT_MODE, myKey, ivspec);
byte[] cipherText = c3des.doFinal(enctext);
return new String(cipherText);
}
}