jBCrypt шифровать и расшифровывать - PullRequest
0 голосов
/ 27 августа 2018

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

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

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

Здесьбазовый пример шифрования / дешифрования:

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

0 голосов
/ 27 августа 2018

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

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

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

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

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

0 голосов
/ 27 августа 2018

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

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

...