Почему Java KeyStore.load в некоторых случаях дает сбой? - PullRequest
0 голосов
/ 23 октября 2019

Следующая проблема возникает при работе на Tomcat 8.5 с Java 10. Сложно обобщить, потому что поведение, которое я наблюдаю, не имеет смысла.

У меня есть хранилище ключей:

InputStream in = new FileInputStream(KEYSTORE_PATH);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());

К которому я обращаюсь, используя:

ks.load(in, PASSWORD);

, где ПАРОЛЬ - это символ []

Я хранюпароль в БД, используя зашифрованную форму.

Так как у меня проблемы, показанные в Прил. 1 и отл. 2, я заменил зашифрованный пароль на незашифрованную форму временно, так как KeyStore.load требует незашифрованный пароль.

ks.load () работает правильно, когда я получаю незашифрованный пароль из БД с помощью подкласса свойств.

Но следующее не работает, предположим, пароль - P @ ssw0rd:

Пример. 1

String = "P@ssw0rd"
ks.load(in, pwd.toCharArray());

Отл. 2

char[] pwd = new char[] {'P','@', 's', 's', 'w', '0', 'r', 'd'};
ks.load(in, pwd);

Если я запускаю Ex. 1 и отл. 2 теста в основном методе, то я не получаю никаких ошибок.

Таким образом, использование значения БД как есть, работает нормально, если значение не зашифровано. В конечном итоге это значение будет зашифровано, поэтому мне нужно получить расшифрованную строку. Но, как показано в Ex. 1 и отл. 2, передача чего-либо другого исходного значения БД в KeyStore.load вызывает ошибку, это будет расшифрованный пароль.

Может быть, кто-то может увидеть, какую ошибку я совершаю, или указать на что-то еще, что я могу попробовать.

Исключение:

java.io.IOException: keystore password was incorrect
    at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2097)
    at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:243)
    at java.base/java.security.KeyStore.load(KeyStore.java:1479)
    at org.springframework.security.saml.key.JKSKeyManager.initialize(JKSKeyManager.java:117)
    ... 124 more
Caused by: java.security.UnrecoverableKeyException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
...