Почему два моих метода хеширования MD5 производят разные хэши? - PullRequest
1 голос
/ 22 марта 2012

Я новичок в Java и действительно нуждаюсь в помощи.Я создал инструмент командной строки, чтобы получить MD5-хеш файла.Это сработало, поэтому я адаптировал свой код, чтобы поместить его в форму графического интерфейса.Две программы дают разные хэши одного и того же файла, что сбивает с толку.Я посмотрел в UTF-8, но, насколько я могу судить, это будет работать только для строк, а не экземпляра файла.Может кто-нибудь сказать мне, почему они предоставляют различные значения хеша и указать мне в правильном направлении?

Первый метод (командная строка) ...

    public static void main(String args[]) throws IOException, NoSuchAlgorithmException {

    System.out.println("Please enter file path: \n");

    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    String dir = stdin.readLine();
    File file = new File(dir);

    FileInputStream iStream = null;

    try {iStream = new FileInputStream(file);}
    catch (FileNotFoundException e) {      
        String MD5Output = "There has been an error: " + e.toString();   
    }

    byte[] dataBytes = new byte[1024];

    MessageDigest md = MessageDigest.getInstance("MD5");

    int numRead = iStream.read(dataBytes);
        md.update(dataBytes, 0, numRead);

        iStream.close();

        dataBytes = md.digest();

    md.update(dataBytes);
    System.out.println("MD5: " + new BigInteger(1, md.digest()).toString(16));

}

Второй метод (построен для графического интерфейса пользователя)...

    public void doMD5() throws IOException, NoSuchAlgorithmException {

    File file = new File(jTxtMD51.getText());

    FileInputStream iStream = null;

    try {iStream = new FileInputStream(file);}
    catch (FileNotFoundException e) {      
        String MD5Output = "There has been an error: " + e.toString();   
    }

    byte[] dataBytes = new byte[1024];

    MessageDigest md = MessageDigest.getInstance("MD5");

    int numRead = iStream.read(dataBytes);
        md.update(dataBytes, 0, numRead);

        iStream.close();

        byte[] MD5checksum = md.digest();

    md.update(dataBytes);

    BigInteger bigInt = new BigInteger(1, md.digest());
    String MD5Hash = bigInt.toString(16);

    jTextOutput.append("MD5 is : " + MD5Hash);

}

Ответы [ 2 ]

1 голос
/ 22 марта 2012

вы делаете только один вызов чтения из потока.Вы должны зацикливаться при чтении InputStream (при условии, что вы хотите прочитать все, что вы обычно хотите).кроме того, вы, кажется, делаете 2 вызова функции digest.update (), используя одни и те же байты.

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

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

В дополнение к комментарию @ jtahlborn вам не нужен вызов md.update(databytes); в обоих методах, и ваш второй метод должен иметь его в конце:

BigInteger bigInt = new BigInteger(1, MD5checksum);

Ваш первый метод не имеетсделать этот второй вызов digest (), значения которого меняются при вызове update ()

...