Как декодировать с помощью MessageDigest, Base64

Я в настоящее время кодирую пароль. Я должен расшифровать пароль. Вот код для кодирования. Я пытаюсь получить оригинальный пароль, сравнить его. Я исследовал MessageDigest, который говорит, что это односторонний метод. Не уверен, как получить оригинальное сообщение. У нас есть метод декодирования, но он не дает мне исходный пароль - Base64.decode.

 public static synchronized String getMD5_Base64(String input) {
        if (!isInited) {
            isInited = true;
            try {
                digest = MessageDigest.getInstance("MD5");
            } catch (Exception ex) {
            }
        }
        if (digest == null)
            return input;

        // now everything is ok, go ahead
        try {
            digest.update(input.getBytes("UTF-8"));
        } catch (java.io.UnsupportedEncodingException ex) {
        }
        byte[] rawData = digest.digest();
        byte[] encoded = Base64.encode(rawData);
        String retValue = new String(encoded);
        return retValue;
    }
}
7
задан Shawn D. 13 August 2010 в 19:02
поделиться

3 ответа

Алгоритм хеширования MD5, как и все алгоритмы хеширования, односторонний. Единственный способ восстановить исходный пароль - это попробовать все возможности, пока вы не получите тот, чей хэш MD5 совпадает с полученным вами.

3
ответ дан 6 December 2019 в 08:13
поделиться

Вы не можете получить оригинальный пароль. Помните, что дайджест и кодирование Base64 делают две совершенно разные вещи. Дайджест MD5 создает криптографический хэш предоставленных ему данных. Это необратимо. Base64 - это механизм кодирования для преобразования данных (которые могут содержать непечатаемые двоичные данные) в строку, которая гарантированно содержит только печатаемые символы. Этот шаг является обратимым.

Стандартный способ проверки пароля не заключается в декодировании оригинального пароля и сравнении открытого текста. Что вам нужно сделать, так это использовать кодирование (MD5-хэш, затем Base64-кодирование), которое вы выполнили для исходного пароля, и применить его к новому паролю. Затем сравните сохраненную кодированную версию с новой кодированной версией. Если они одинаковы, значит, пароли совпали.

Такая конструкция является более безопасным механизмом, чем хранение паролей, которые могут быть расшифрованы. Таким образом, если кто-то украдет вашу базу данных паролей, он не получит автоматически доступ ко всем паролям ваших пользователей. Для того чтобы взломать систему, им все равно придется найти пароль, который кодируется в то же значение. Смысл криптографических хэшей типа MD5 в том, чтобы сделать это очень сложным. С другой стороны, MD5 уже не считается очень надежным хэшем. Лучше использовать SHA1 или SHA256 (но помните, что вы не сможете изменить существующие сохраненные пароли с их MD5-хэша на другой хэш без оригинального пароля, которого у вас нет, т.е. вы не сможете просто преобразовать вашу базу сохраненных паролей).

10
ответ дан 6 December 2019 в 08:13
поделиться

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

Для сравнения вам нужно будет где-то сохранить исходное значение пароля. Лучшим способом, вероятно, является шифрование (и результат в формате base64) перед сохранением его в базе данных. Затем, чтобы провести сравнение, вы расшифровываете каждое из значений и выполняете нужную работу

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

1
ответ дан 6 December 2019 в 08:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: