我已尝试使用以下代码生成字符串的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 question和this other question。请注意,这不是这些问题的重复,因为它们是关于格式化输出。
问题是它产生的结果与在Linux中通过sha1sum
命令运行相同的输入字符串不同 - > echo test|sha1sum
。
"测试"的Java代码输出 - > a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
linux终端中的sha1sum用于"测试" - > 4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
MessageDigest
类和Linux的sha1sum
实用程序实现相同的算法?答案 0 :(得分:20)
问题是你如何在Linux下使用sha1sum
和echo。它包括换行。将其分为几个步骤:
echo test > somefile
sha1sum somefile
会显示相同的结果......但如果你看somefile
,你会看到 5 字节长而不是4.编辑它以摆脱拖尾线feed,再次运行sha1sum
,你会看到Java给出的答案。
如果您对-n
使用echo
选项,则应该没问题:
$ echo -n test | sha1sum
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 -