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 любая защищенная хеш-функция не обеспечивает такую функциональность восстановления