Shell脚本相当于Java MessageDigest

时间:2013-01-14 11:01:07

标签: java shell cryptography openssl sha1

如何仅使用shell脚本运行以下Java功能?不应该openssl做的伎俩?由于某种原因,值不相同。

外壳:

$ cat test.txt 
test
$ openssl sha1 test.txt
SHA1(test.txt)= fde773a18bb29f5ed65e6f0a7aa717fd1fa485d4

Java代码(play framework origin):

import org.apache.commons.codec.binary.Hex;

public static String hexSHA1() {
    value = "test";
    try {
        MessageDigest md;
        md = MessageDigest.getInstance("SHA-1");
        md.update(value.getBytes("utf-8"));
        byte[] digest = md.digest();

        return byteToHexString(digest);
    } catch (Exception ex) {
        return null;
    }
}


public static String byteToHexString(byte[] bytes) {
    // a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
    return String.valueOf(Hex.encodeHex(bytes));
}

fde773a18bb29f5ed65e6f0a7aa717fd1fa485d4!= a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

2 个答案:

答案 0 :(得分:7)

test.txt末尾有回车和换行。这些显然不在您的Java字符串中。

$ echo -n test > test.txt
$ openssl sha1 test.txt
SHA1(test.txt)= a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

$ echo -ne 'test\r\n' > test2.txt
$ openssl sha1 test2.txt
SHA1(test2.txt)= fde773a18bb29f5ed65e6f0a7aa717fd1fa485d4

答案 1 :(得分:0)

值与您为test.txt文件计算SHA1的第一种情况不同,在下一种情况下,您为test字符串计算相同内容。

如果你打算从java app中调用openssl,请使用以下代码片段:

Runtime.getRuntime()。exec('openssl','sha1','test.txt')