Вывод 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
класс и Linuxsha1sum
утилита реализует тот же алгоритм ?
1 ответов
проблема в том, как вы используете sha1sum
под Linux с echo. В том числе и на линии. Чтобы разделить его на шаги:
echo test > somefile
sha1sum somefile
покажет тот же результат... но если вы посмотрите на somefile
вы увидите, что это 5 байт длиной вместо 4. Отредактируйте его, чтобы избавиться от подачи трейлинг-линии, запустите sha1sum
снова, и вы увидите тот же ответ, который дает Java.
если вы используете на echo
, это должно быть хорошо:
$ echo -n test | sha1sum
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 -