我必须在数据库表中存储与其他数据库的连接详细信息,我必须加密这些数据库的密码,并且必须能够通过SQL脚本“手动”将数据插入到该表中...
我需要加密和解密它,因为我的应用程序必须能够使用这些数据并连接到其他数据库,因此MD5和类似的功能无用..
我想到了Blowfish,AES等...但是如果我将密码存储为数据库中的VARCHAR,则解密部分不起作用...所以我将其存储为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 [] soooo没有脚本可用...
有什么想法吗?
答案 0 :(得分:2)
似乎当你将密钥存储为字节某处某处不正确地解释它时。它可能是一个字符编码问题。
如果要将密钥存储为文本,可能需要先对其进行base64编码。然后,您可以将文本base64解码回密钥。
答案 1 :(得分:1)
最后,正如maerics所说,我这样解决了:
import org.apache.commons.net.util.Base64;
public class MyCrypto {
/**
* Codifica un texto usando Base64.
* @param texto <code>String</code> texto a codificar.
* @return <code>String</code> texto codificado.
*/
public static String encrypt(String texto) {
return new String(Base64.encodeBase64(texto.getBytes()));
}
/**
* Decodifica un texto usando Base64.
* @param texto <code>String</code> texto a decodificar.
* @return <code>String</code> texto decodificado.
*/
public static String decrypt(String texto) {
return new String(Base64.decodeBase64(texto.getBytes()));
}
}
答案 2 :(得分:0)
String encrypted = new BASE64Encoder ().encodeBuffer ( encryptedBytes );
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] recoveredBytes = cipher.doFinal( new BASE64Decoder ().decodeBuffer ( encrypted ) );