別のデータベースへの接続の詳細をDBテーブルに保存する必要があり、それらのDBのパスワードを暗号化する必要があり、SQLスクリプトを介してそのテーブルにデータを「手動で」挿入できる必要があります...
私のアプリはそれらのデータを使用して他のデータベースに接続できる必要があるため、暗号化して復号化する必要があります。そのため、MD5などは役に立ちません。
Blowfish、AESなどを考えましたが、パスワードをVARCHARとしてDBに保存すると、復号化部分が機能しません...したがって、BYTEとして保存しましたが、そうすると、誰もスクリプトを記述できなくなります。テーブルにデータをプリロードします。
多分私はここで何かが欠けています...
テーブル内のレジストリがVARCHARとして定義されたときに使用したコードは次のとおりです。
package main;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
public class Prueba {
private static final String keyValue = "fd<[;.7e/OC0W!d|";
private static final String ALG = "Blowfish";
public static void main(String[] args) {
String text = "some random text";
try {
SecretKeySpec key = new SecretKeySpec(keyValue.getBytes(), ALG);
Cipher cipher = Cipher.getInstance(ALG);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(text.getBytes());
String encrypted = new String(encryptedBytes);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] recoveredBytes = cipher.doFinal(encrypted.getBytes());
String recovered = new String(recoveredBytes);
} catch (NoSuchAlgorithmException nsa) {
nsa.printStackTrace();
} catch (NoSuchPaddingException nspe) {
nspe.printStackTrace();
} catch (InvalidKeyException ike) {
ike.printStackTrace();
} catch (BadPaddingException bpe) {
bpe.printStackTrace();
} catch (IllegalBlockSizeException ibse) {
ibse.printStackTrace();
}
}
}
そして、私は例外を受け取ります:
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
at com.sun.crypto.provider.BlowfishCipher.engineDoFinal(DashoA12275)
at javax.crypto.Cipher.doFinal(DashoA12275)
at main.Prueba.main(Prueba.java:30)
代わりに:
byte[] recoveredBytes = cipher.doFinal(encrypted.getBytes());
そうです
byte[] recoveredBytes = cipher.doFinal(encryptedBytes);
例外はありませんが、パスワードをbyte[]として保存する必要があります。スクリプトは使用できません...
何か案は?