2017-07-31 235 views
0

我已经在SO中检查过类似的问题,但没有人能回答我的问题,所以在此发布我的问题。 在我的代码中进行第三方API调用之前,我需要为密码生成原始SHA。 我使用的是存在于apache编解码库中的DigestUtils。以下是Java代码java中的原始SHA1与PHP中的原始SHA1不匹配

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

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

而且PHP代码(我在谷歌获得)如下

$passwordSha = sha1($password, true); 

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

对于输入的 “密码”,下面是输出

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

我不知道是否比较这些垃圾值是正确的,但是我生成的最终密码摘要,依赖于上面的代码在PHP和JAVA中是不同的。 (在PHP中获得正确的值)。

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

UPDATE

编辑输出。我的坏..

一些更针对不同的输入

输入的结果: “secretnonce101112015-09-30T14:12:15Za`t^X”

JAVA: “S AM; *”

PHP: “我>рq”

我在java输出中看到一些额外的字符。不知道这是否毁了我的最终密码摘要。

+0

将随机字节转换为“String”是非常没用的。十六进制字符串更具可读性。但是你的意思是,你从这两个系统获得相同的值,所以......? – Kayaman

+0

粘贴输出时出现了一些问题。更正它。 –

回答

0

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

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

    return DigestUtils.sha1Hex(input); 
} 

VS

$passwordSha = sha1($password, false); 
+0

是的。我为shaHex()和sha1($ password,false)获得相同的输出。基本上十六进制表示法在java和php中给出相同的输出。我不确定使用原始SHA1时出了什么问题。是的,第三方API期望我们生成原始SHA,这是怎么在这 –

+0

然后它必须是类型铸造,那么: 返回新的字符串(DigestUtils.sha1(输入),“US-ASCII” ); – Doug

+0

JAVA: s A M ; * PHP:>i> рq 仍然不一样。我无法确定可能出现的问题 –