Как декодировать с помощью MessageDigest, Base64 - PullRequest
6 голосов
/ 13 августа 2010

Я в настоящее время кодирую пароль.Я должен расшифровать пароль.Вот код для кодирования.Я пытаюсь получить оригинальный пароль, сравнить его.Я исследовал 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;
    }
}

Ответы [ 4 ]

10 голосов
/ 13 августа 2010

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

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

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

8 голосов
/ 24 февраля 2013

MessageDigest с MD5 - это односторонний хэш. Итак, почему бы вам не использовать javax.crypto , который может легко шифровать и дешифровать. Вот пример:

import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import org.apache.commons.codec.binary.Base64;

public class EncryptDecrypt {
    private static final String UNICODE_FORMAT = "UTF8";
    public static final String DESEDE_ENCRYPTION_SCHEME = "DESede";
    private KeySpec ks;
    private SecretKeyFactory skf;
    private Cipher cipher;
    byte[] arrayBytes;
    private String myEncryptionKey;
    private String myEncryptionScheme;
    SecretKey key;

    public EncryptDecrypt() throws Exception {
        myEncryptionKey = "ThisIsSpartaThisIsSparta";
        myEncryptionScheme = DESEDE_ENCRYPTION_SCHEME;
        arrayBytes = myEncryptionKey.getBytes(UNICODE_FORMAT);
        ks = new DESedeKeySpec(arrayBytes);
        skf = SecretKeyFactory.getInstance(myEncryptionScheme);
        cipher = Cipher.getInstance(myEncryptionScheme);
        key = skf.generateSecret(ks);
    }


    public String encrypt(String unencryptedString) {
        String encryptedString = null;
        try {
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] plainText = unencryptedString.getBytes(UNICODE_FORMAT);
            byte[] encryptedText = cipher.doFinal(plainText);
            encryptedString = new String(Base64.encodeBase64(encryptedText));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return encryptedString;
    }


    public String decrypt(String encryptedString) {
        String decryptedText=null;
        try {
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] encryptedText = Base64.decodeBase64(encryptedString.getBytes());
            byte[] plainText = cipher.doFinal(encryptedText);
            decryptedText= new String(plainText);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return decryptedText;
    }


    public static void main(String args []) throws Exception
    {
        EncryptDecrypt td= new EncryptDecrypt();

        String target="password@123";
        String encrypted=td.encrypt(target);
        String decrypted=td.decrypt(encrypted);

        System.out.println("String To Encrypt: "+ target);
        System.out.println("Encrypted String: " + encrypted);
        System.out.println("Decrypted String: " + decrypted);

    }
}
3 голосов
/ 13 августа 2010

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

1 голос
/ 13 августа 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...