jBCrypt шифровать и расшифровывать

Я узнал о jBCrypt для хеширования пароля и хранения в БД. Но я не нашел никакой возможности вернуть действительное значение из хешированного значения. Только BCrypt.checkpw(password, hashedPassword) доступен, который возвращает логическое значение. http://www.mindrot.org/projects/jBCrypt/ Как узнать фактическое значение из хешированного значения. Если это невозможно в jBCrypt, есть ли другой способ зашифровать и расшифровать значения в java? Заранее спасибо...

3 ответа

Вместо использования хэш-функции, вы можете использовать симметричный алгоритм шифрования, как предлагается Spring Securityот их Crypto Moduleточнее их класс Encryptors.

Вот базовый пример шифрования / дешифрования:

public static void main(String[] args) {
        final String salt = UUID.randomUUID().toString().replace("-", "");
        TextEncryptor textEncryptor = Encryptors.delux("my-super-secure-password-for-the-encryptor", salt);
        final String passwordToBeEncrypted = "my-secure-password-to-be-encrypted";
        final String encrypted = textEncryptor.encrypt(passwordToBeEncrypted);
        textEncryptor.decrypt(encrypted);
        System.out.println(passwordToBeEncrypted.equalsIgnoreCase(textEncryptor.decrypt(encrypted)));
}

Здесь я использую delux, Согласно их документации:

Создает текстовый шифратор, который использует более надежное шифрование на основе пароля.

Имейте в виду, что это очень наивный подход к шифрованию и дешифрованию.

Я бы не рекомендовал вам копировать и вставлять это решение в ваш производственный код.

Для того чтобы эта функциональность была готова к работе, вы хотите, чтобы пароль был предоставлен Encryptors.delux() храниться где-то в безопасности. Кроме того, вы также хотите использовать другой способ генерации соли для вашего пароля (возможно, соли для каждого нового шифрования пароля) и сохранения ее для дальнейшего использования, где вы хотите расшифровать свой пароль.

Кроме того, вы можете не сохранять пароль в виде обычного текста (String), а сохранять его как char[] или же byte[], но это должно дать начало, откуда вы можете начать.

Существует также другая библиотека, которая делает то же самое, от Apache, Apache Commons Crypto, которая использует те же алгоритмы, что и Spring Crypto,

Имейте в виду, что вы более безопасно используете библиотеку, а не реализуете сами себя, поскольку используете пакет javax.crypto потребует от вас знать, что вы делаете, и не причинять больше вреда, чем необходимо.

Примечание: вы можете столкнуться с ситуацией, когда ваш jdk ограничен 128 битами. Чтобы извлечь выгоду из 256 бит, убедитесь, что вы добавили Java Cryptography Extension

Но я не нашел никакой возможности вернуть реальное значение из хешированного значения.

Что ж, это основная цель криптографических хеш-функций.

Есть ли другой способ шифрования и дешифрования значений в Java? Заранее спасибо...

Есть много примеров для шифрования / дешифрования значений в Java, просто ищите их, даже здесь, на SO. Вы также можете заглянуть в мой блог о шифровании в Java - об основном низкоуровневом крипто API.

Я надеюсь, что вы не хотите использовать шифрование для паролей пользователей - даже удаленная возможность сделать пароли обратимыми сделает вашу систему потенциально опасной для утечек.

Определение хеш-функции имеет устойчивость к прообразам: учитывая h(x), должно быть невозможно восстановить x. Хеш-функция, являющаяся "обратимой", является полной противоположностью этого свойства. Следовательно, вы не можете отменить хеш-функцию, следовательно, невозможно получить фактическое значение из хешированного значения. Вы не можете получить x из h(x), единственное, что вы можете сделать, это получить новый пароль y, вычислить h(y) и посмотреть, оно равно h(x).

Не только jBcrypt любая защищенная хеш-функция не обеспечивает такую ​​функциональность восстановления

Другие вопросы по тегам