java 中的原始 SHA1 与 PHP 中的不匹配

Raw SHA1 in java does not match the one in PHP

我已经在 SO 中检查了类似的问题,但其中 none 可以回答我的问题,因此请在此处发布我的问题。 在我的代码中进行第三方 API 调用之前,我需要为密码生成原始 SHA。 我正在使用 apache 编解码器库中的 DigestUtils。以下是java代码

public static String sha1 (String input) 
    throws NoSuchAlgorithmException, 
        UnsupportedEncodingException {

    return new String(DigestUtils.sha(input));
}
// I suppose this gives me raw SHA. 

下面是 PHP 代码(我在 google 中得到)

$passwordSha = sha1($password, true);

// The boolean value gives the SHA in binary format.

输入"PASSWORD",输出如下

JAVA : "+��0G���i.)�\�I�_�7"
PHP  : "+��0G���i.)�\�I�_�7"

我不确定比较这些垃圾值是否正确,但是,我生成的最终密码摘要取决于上述代码,在 PHP 和 JAVA 中有所不同。 (在 PHP 中获得正确的值)。

请帮助我了解在 PHP 和 JAVA 中生成原始 SHA1 的区别。

更新

编辑了输出。我的坏..

不同输入的更多结果

输入:"secretnonce101112015-09-30T14:12:15Z��a�����`�t�.�^X�"

JAVA : "��s�� ����A��M��;����*"

PHP : "����i>��рq��������"

我在 java 输出中看到一些额外的字符。不确定这是否会破坏我的最终密码摘要。

我不知道您是否以某种方式在类型转换为 String 时丢失了一些东西,但是您可以尝试以下操作并比较输出吗?这应该将两者都表示为十六进制字符串。

public static String sha1 (String input) 
    throws NoSuchAlgorithmException, 
        UnsupportedEncodingException {

    return DigestUtils.sha1Hex(input);
}

$passwordSha = sha1($password, false);

在转换为字符串时使用 ISO-8859-1 编码后,我得到了正确的输出。

所以字符串应该用 ISO-8859-1 编码转换成 byte[]

byte[] passwordSha = sha(input.getBytes("ISO-8859-1"));

这对我有用.. 为此提到 PHP and Java hmac hash output matches in hex, doesn't match in raw binary. What's happening?