1

別のデータベースへの接続の詳細を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[]として保存する必要があります。スクリプトは使用できません...

何か案は?

4

3 に答える 3

2

結局、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()));
    }
}
于 2013-01-04T08:59:05.800 に答える
2

キーをバイトとして保存すると、どこかで間違って解釈されているようです。文字エンコーディングの問題である可能性があります。

キーをテキストとして保存する場合は、最初に base64 でエンコードすることをお勧めします。次に、テキストを base64 デコードしてキーに戻すことができます。

于 2012-10-09T15:27:15.253 に答える