Вывод Java SHA1 не совпадает с командой Sha1sum Linux

Я пробовал следующий код для создания дайджеста SHA1 строки:

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;

public class SHA1 {
    private static String encryptPassword(String password)
    {
        String sha1 = "";
        try
        {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(password.getBytes("UTF-8"));
            sha1 = byteToHex(crypt.digest());
        }
        catch(NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch(UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        return sha1;
    }

    private static String byteToHex(final byte[] hash)
    {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }

    public static void main(String args[]){
        System.out.println(SHA1.encryptPassword("test"));

    }
}

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

проблема в том, что он дает другой результат, чем запуск той же входной строки через в Linux -> echo test|sha1sum.

вывод кода Java для " test" -> a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 sha1sum в терминале linux для "test" ->4e1243bd22c66e76c2ba9eddc1f91394e57f9f83

  • почему они не одинаковые ?
  • не Java MessageDigest класс и Linux sha1sum утилита реализует тот же алгоритм ?

1 ответов


проблема в том, как вы используете sha1sum под Linux с echo. В том числе и на линии. Чтобы разделить его на шаги:

echo test > somefile
sha1sum somefile

покажет тот же результат... но если вы посмотрите на somefile вы увидите, что это 5 байт длиной вместо 4. Отредактируйте его, чтобы избавиться от подачи трейлинг-линии, запустите sha1sum снова, и вы увидите тот же ответ, который дает Java.

если вы используете на echo, это должно быть хорошо:

$ echo -n test | sha1sum
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3  -