Крипто модуль Spring Security - BadPaddingException: данный последний блок заполнен неправильно - PullRequest
0 голосов
/ 26 сентября 2018

Я пытался создать утилиту шифрования, я хочу зашифровать строку, сохранить в db, затем расшифровать, я использую запрашиваемый криптографический модуль безопасности весной TextEncryptor, потому что я хочу использовать для отдыха apiKey, но я не могу сделатьэто работает.

Вот мой код:

        import org.springframework.security.crypto.encrypt.Encryptors;
        import org.springframework.security.crypto.encrypt.TextEncryptor;
        import org.springframework.security.crypto.keygen.KeyGenerators;

        public class CryptoUtil {

            public static String encrypt(String plain, String password) {
                String salt = KeyGenerators.string().generateKey();
                TextEncryptor textEncryptor = Encryptors.queryableText(password, salt);
                return textEncryptor.encrypt(plain);
            }

            public static String decrypt(String encrypted, String password) {
                String salt = KeyGenerators.string().generateKey();
                TextEncryptor textEncryptor = Encryptors.queryableText(password, salt);
                return textEncryptor.decrypt(encrypted);
            }
        }

    ----------------------------------------------------    

    public static void main(String[] args) {
        String password = "password";
        String plain = "hello";

        String encrypted = CryptoUtil.encrypt(plain,password);`enter code here`
        String decrypted = CryptoUtil.decrypt(encrypted, password);
    }

    ----------------------------------------------------

    Exception in thread "main" java.lang.IllegalStateException: Unable to invoke Cipher due to bad padding
            at org.springframework.security.crypto.encrypt.CipherUtils.doFinal(CipherUtils.java:142)
            at org.springframework.security.crypto.encrypt.AesBytesEncryptor.decrypt(AesBytesEncryptor.java:128)
            at org.springframework.security.crypto.encrypt.HexEncodingTextEncryptor.decrypt(HexEncodingTextEncryptor.java:40)
            at com.ind.app.util.CryptoUtil.decrypt(CryptoUtil.java:18)
            at com.ind.app.Test.main(UsuarioTest.java:11)
            Caused by: javax.crypto.BadPaddingException: Given final block not properly padded
                at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)
                at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
                at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
                at javax.crypto.Cipher.doFinal(Cipher.java:2165)
                at org.springframework.security.crypto.encrypt.CipherUtils.doFinal(CipherUtils.java:135)
                ... 4 more

1 Ответ

0 голосов
/ 28 сентября 2018

Для тех, кто сталкивается с такой же проблемой:

String salt = KeyGenerators.string (). GenerateKey ();

Каждый вызовэта строка в соответствии с документами:

Создает StringKeyGenerator, который шестнадцатерично кодирует ключи SecureRandom длиной 8 байтов.Шестнадцатеричная строка имеет длину keyLength * 2 символа.

Таким образом, соль случайна, например: plain : "hello" password :«пароль» соль : «e606bfd5cf9f198e»

в зашифрованном виде : «60e0e953841ca708b74ac657735a2236076f0a614ec85548d163fadf91e2be8f *, затем 10 *, 1064метод генерирует другую (случайную) соль, поэтому TextEncryptor.decrypt (String encrypted) не может правильно расшифровать, потому что соль не совпадает.

Encryptors.queryableText(Пароль CharSequence, соль CharSequence)

Создает шифратор для запрашиваемых текстовых строк, который использует стандартное шифрование на основе пароля.Использует 16-байтовый вектор инициализации "все ноль", поэтому шифрование одинаковых данных приводит к тому же результату шифрования.Это сделано для того, чтобы можно было запрашивать зашифрованные данные.Зашифрованный текст в шестнадцатеричном формате.

CryptoUtil работает для шифрования и дешифрования простых строк, не рекомендуется для паролей , но полезно, например, для ключей API.

public class CryptoUtil {

private static final String salt = "e606bfd5cf9f198e"; //any random generated salt

        public static String encrypt(String plain, String password) {
            TextEncryptor textEncryptor = Encryptors.queryableText(password, salt);
            return textEncryptor.encrypt(plain);
        }

        public static String decrypt(String encrypted, String password) {
            TextEncryptor textEncryptor = Encryptors.queryableText(password, salt);
            return textEncryptor.decrypt(encrypted);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...