0

こんにちは、Java の初心者で、次の問題があります。blowfish アルゴリズムを使用してユーザーのパスワードを暗号化しようとしていますが、認証を確認するためにパスワードを復号化しようとすると、何らかの理由で復号化に失敗します。 .

public static String encryptBlowFish(String to_encrypt, String salt){
    String dbpassword = null;
    try{
        SecretKeySpec skeySpec = new SecretKeySpec( salt.getBytes(), "Blowfish" );

        // Instantiate the cipher.
        Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

        //byte[] encrypted = cipher.doFinal( URLEncoder.encode(data).getBytes() );
        byte[] encrypted = cipher.doFinal( to_encrypt.getBytes() );
        dbpassword = new String(encrypted);
    } catch (Exception e) {
        System.out.println("Exception while encrypting");
        e.printStackTrace();
         dbpassword = null;
    } finally {
        return  dbpassword;
    }
}

public static String decryptBlowFish(String to_decrypt, String salt){
    String dbpassword = null;
    try{
        SecretKeySpec skeySpec = new SecretKeySpec( salt.getBytes(), "Blowfish" );

        // Instantiate the cipher.
        Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);

        //byte[] encrypted = cipher.doFinal( URLEncoder.encode(data).getBytes() );
        byte[] encrypted = cipher.doFinal( to_decrypt.getBytes() );
        dbpassword = new String(encrypted);
    } catch (Exception e) {
        System.out.println("Exception while decrypting");
        e.printStackTrace();
        dbpassword = null;
    } finally {
        return  dbpassword;
    }
}

復号化関数を呼び出すと、次のエラーが表示されます: java.security.InvalidKeyException: Parameters missing

何か案は?ありがとうございました

4

1 に答える 1

2

あなたはここで複数のことを間違っています:

  • 暗号化された値を文字列に変換しています。すべてのバイトが有効な文字列であるとは限りません。バイトを文字列としてではなく、バイナリ BLOB としてデータベースに直接保存します (または最初に 16 進数または base64 に変換します)。

  • あなたはソルトとキーを混同しています。コードで呼び出しているsaltのは、実際には秘密鍵です。あなたは本物の塩を持っているようには見えません。

  • パスワードを暗号化しています。つまり、キーをどこかに保存する必要があります (データベースに保存することはできません。そうしないと、データベースを盗んだ人がパスワードを解読できてしまいます)。代わりに、ハッシュを使用する必要があります。

  • それでも、この方法でパスワードを保存しないでください。たとえ塩を正しく使っていたとしても。最近では、単純にハッシュ化されたパスワードは、ソルトされていても簡単にクラックできます。代わりに、bcrypt ライブラリまたは PBKDF2 を使用してください。

これを正しく行うための手順は次のとおりですこれらの指示に従えば、パスワードを文字列として保存しても問題ないことに注意してください (正しく変換されています)。

于 2013-11-09T20:19:07.133 に答える