【问题标题】:Raw SHA1 in java does not match the one in PHPjava中的原始SHA1与PHP中的不匹配
【发布时间】:2017-09-30 06:16:49
【问题描述】:

我在 SO 中检查了类似的问题,但没有一个可以回答我的问题,所以在这里发布我的问题。 在我的代码中进行第三方 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 是非常没用的。十六进制字符串更具可读性。但是你的意思是什么,你从两个系统中得到相同的值,所以......?
  • 粘贴输出时出现问题。已更正。

标签: java php sha


【解决方案1】:

我不知道您是否以某种方式丢失了类型转换为字符串的内容,但是您可以尝试以下方法并比较输出吗?这应该表示为一个十六进制字符串。

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

    return DigestUtils.sha1Hex(input);
}

$passwordSha = sha1($password, false);

【讨论】:

  • 是的。我得到 shaHex() 和 sha1($password, false) 的相同输出。基本上十六进制表示在 java 和 php 中给出相同的输出。我不确定在使用原始 SHA1 时出了什么问题。是的,第三方 API 期望我们生成原始 SHA,这就是它的魅力
  • 那一定是类型转换了,怎么办:return new String(DigestUtils.sha1(input), "US-ASCII");
  • JAVA :�s�� ���A�M����;����* PHP :��i>�рq�������� 仍然不一样。我对可能出现的问题一无所知
  • 您不需要这样做,但如果十六进制值相同,您可以随时添加十六进制解码:commons.apache.org/proper/commons-codec/apidocs/org/apache/…
  • @pavitrashanbhag 您是通过 API 运行两者进行比较,还是打印到屏幕上进行比较?也许它们是相同的,但不同之处在于不可打印字符的打印方式。
【解决方案2】:

在转换为字符串时使用 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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多