Сбой шифрования кросс-платформенный

Я работаю над обновлением утилиты шифрования паролей от чего-то полностью доморощенного до созданного на основе Jasypt и Bouncy Castle. Утилита шифрует пароль; затем зашифрованная строка вставляется в файл свойств, считывается и расшифровывается приложением Grails.

Я написал утилиту командной строки Java для шифрования пароля. Соответствующий код Java:

public class PasswordUtility {
    private final String SALT = "randomstring";
    private final StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

    public PasswordUtility( String seed ) {
        String password = SALT + seed;
        encryptor.setProvider( new BouncyCastleProvider() );
        encryptor.setAlgorithm( "PBEWITHSHA256AND192BITAES-CBC-BC" );
        encryptor.setPassword( password );
    }

    public String decrypt( String encryptedText ) {
        String processText = encryptedText;
        return encryptor.decrypt( processText );
    }

    public String encrypt( String plainText ) {
        return encryptor.encrypt( plainText );
    }
}

Код Groovy:

class StringEncryptor {
    String salt = "randomstring"

    private StandardPBEStringEncryptor initCrypto( String keySplit ) {
        StandardPBEStringEncryptor pbe = new StandardPBEStringEncryptor()
        pbe.setProvider( new BouncyCastleProvider() )
        pbe.setAlgorithm( "PBEWITHSHA256AND192BITAES-CBC-BC" )
        String cryptKey = salt + keySplit
        pbe.setPassword( cryptKey )
        return pbe
    }

    String encrypt( String keySplit, String encryptText ) {
        StandardPBEStringEncryptor pbe = initCrypto( keySplit )
        pbe.encrypt( encryptText )
    }

    String decrypt( String keySplit, String encryptText ) {
        log.info encryptText
        log.info keySplit
        StandardPBEStringEncryptor pbe = initCrypto( keySplit )
        pbe.decrypt( encryptText )
    }
}

Когда я запускаю PasswordUtility локально (на Mac), вставляю результаты в файл свойств и локально запускаю Grails, пароль расшифровывается правильно. Когда я запускаю PasswordUtility на виртуальном сервере RHEL и вставляю результаты в файл свойств, я получаю исключение EncryptionOperationNotPossibleException, и, глядя на код, можно предположить, что расшифровка могла завершиться неудачно — строка StandardPBEByteEncryptor 1055). Когда я беру строку с Mac и пытаюсь расшифровать ее на RHEL, расшифровка возвращает нуль. Я могу взять строку из одного блока RHEL и расшифровать ее в другом блоке RHEL.


person strangefreeworld    schedule 08.08.2016    source источник
comment
Обратите внимание, что использование других, кроме Common Crypto, на OSX может привести к значительному снижению производительности.   -  person zaph    schedule 08.08.2016
comment
Вариант использования — это не аутентификация при входе в систему, а хранение паролей, которые впоследствии должны использоваться приложением Grails, для подключения к базе данных и хранилища ключей, которое приложение использует для безопасного подключения к другим элементам системы, работающим на разных серверах.   -  person strangefreeworld    schedule 08.08.2016
comment
stackoverflow.com/questions/15544266/ я бы начал с убедиться, что вы используете идентичный Jdk как на Mac, так и на Linux   -  person V H    schedule 08.08.2016


Ответы (1)


Проблема заключалась в том, что во входящем пароле были подстановочные знаки. Когда я изменил эту часть пароля на буквенно-цифровые символы (или буквенно-цифровые символы и тире), криптография работала кросс-платформенно.

person strangefreeworld    schedule 09.08.2016