Генерация того же хеша MD5 в Java - PullRequest
0 голосов
/ 28 марта 2012

Пытаясь создать безопасный логин, я решил создать хеш MD5, используя следующий код, немного адаптированный из Как я могу сгенерировать хеш MD5?

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

    MessageDigest messageDigest = null;

    try{
        messageDigest = MessageDigest.getInstance("MD5");
    }catch(NoSuchAlgorithmException e){
        System.out.println("Error: " + e);
    }

    messageDigest.reset();
    messageDigest.update(inPassword.getBytes());
    byte[] digest = messageDigest.digest();
    BigInteger bigInt = new BigInteger(1, digest);
    String encodedPass = bigInt.toString(16);

    while (encodedPass.length() < 32) {
        encodedPass = "0" + encodedPass;
    }


    inPassword = encodedPass;

Ответы [ 3 ]

2 голосов
/ 28 марта 2012

Это как минимум часть проблемы:

messageDigest.update(inPassword.getBytes());

Используется кодировка платформы по умолчанию для преобразования пароля в байты.Это может варьироваться в зависимости от системы, на которой вы его запускаете.Я бы настоятельно предложил бы вам указать кодировку - в идеале такую, которая будет справляться со всеми символами Юникода (например, UTF-8).

Возможно, вы также захотите подумать о посоле и использовании чего-то лучшегочем MD5, и я не уверен в том, что вы конвертировали из byte[] в гекс - это может быть нормально, но я бы нашел библиотеку, которая бы делала все это без использования BigInteger.

0 голосов
/ 28 марта 2012

Попробуйте, у меня все работает:

messageDigest.update(myString.getBytes(), 0, myString.length());

Остальная часть вашего кода выглядит правильно. Надеюсь, поможет! :)

0 голосов
/ 28 марта 2012

Ниже приведен полный код, который вам может понадобиться.

import java.io.FileInputStream;
import java.security.MessageDigest;

public class MD5CheckSumExample 
{
    public static void main(String[] args)throws Exception
    {
        MessageDigest md = MessageDigest.getInstance("MD5");
        FileInputStream fis = new FileInputStream("c:\\loging.log");

        byte[] dataBytes = new byte[1024];

        int nread = 0; 
        while ((nread = fis.read(dataBytes)) != -1) {
          md.update(dataBytes, 0, nread);
        };
        byte[] mdbytes = md.digest();

        //convert the byte to hex format method 1
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < mdbytes.length; i++) {
          sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
        }

        System.out.println("Digest(in hex format):: " + sb.toString());

        //convert the byte to hex format method 2
        StringBuffer hexString = new StringBuffer();
        for (int i=0;i<mdbytes.length;i++) {
            String hex=Integer.toHexString(0xff & mdbytes[i]);
            if(hex.length()==1) hexString.append('0');
            hexString.append(hex);
        }
        System.out.println("Digest(in hex format):: " + hexString.toString());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...