Java SHA1输出与Linux的sha1sum命令不同

时间:2014-12-17 13:48:15

标签: java linux sha1

我已尝试使用以下代码生成字符串的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"));

    }
}

此代码基于this questionthis other question。请注意,这不是这些问题的重复,因为它们是关于格式化输出。

问题是它产生的结果与在Linux中通过sha1sum命令运行相同的输入字符串不同 - > echo test|sha1sum

"测试"的Java代码输出 - > a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 linux终端中的sha1sum用于"测试" - > 4e1243bd22c66e76c2ba9eddc1f91394e57f9f83

  • 为什么他们不一样?
  • 不是Java的MessageDigest类和Linux的sha1sum实用程序实现相同的算法?

1 个答案:

答案 0 :(得分:20)

问题是你如何在Linux下使用sha1sum和echo。它包括换行。将其分为几个步骤:

echo test > somefile
sha1sum somefile

会显示相同的结果......但如果你看somefile,你会看到 5 字节长而不是4.编辑它以摆脱拖尾线feed,再次运行sha1sum,你会看到Java给出的答案。

如果您对-n使用echo选项,则应该没问题:

$ echo -n test | sha1sum
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3  -