我已经在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输出中看到一些额外的字符。不确定这是否会破坏我的最终密码摘要。
答案 0 :(得分:0)
我不知道你是否会以某种方式将类型转换中的东西丢失为String,但是你可以尝试以下方法并比较输出吗?这应该表示为十六进制字符串。
public static String sha1 (String input)
throws NoSuchAlgorithmException,
UnsupportedEncodingException {
return DigestUtils.sha1Hex(input);
}
VS
$passwordSha = sha1($password, false);
答案 1 :(得分:0)
在转换为String时使用ISO-8859-1编码后,我得到了正确的输出。
所以String应该用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?。