比较bytes []和String.getBytes()

时间:2013-04-25 00:14:09

标签: java encoding character-encoding

我正在调试OAuth(shindigspring-security-oauth库的自定义实现。

无论shindig和spring-security细节如何,我都使用sha()创建一个哈希,然后将其传递给spring-security-oauth。我希望哈希是平等的,但它们不是。

狂欢

bytes[] shindigHash = sha(someBytes); // docs for sha()

spring-security-oauth

bytes[] b = str.getBytes("UTF-8");` // String str passed in from 

我还尝试使用bytes[] b = str.getBytes();作为默认编码,但是当我比较shindigHashb的每个元素时,它都不等于shindigHash

修改

for j = 0 .. b.length // same as shindigHash length
   print shindigHash[j] ... b[j]
end
visually compare results

1 个答案:

答案 0 :(得分:2)

getBytes()不会返回哈希值。它返回字符串的字节表示。所以他们永远不会对应。

SHA-1(或其他一些哈希)的一种可能表示是十六进制数字的字符串。

“af45deadbeef”

这是一个字符串。在其上调用getBytes()不会返回哈希值。为什么呢?

好吧,考虑一个简单的哈希:

0000000亿

这是一堆零字节。 byte[]将为{ 0, 0, 0, ... }

然而,

"00000000000000".getBytes("utf-8")

将返回

 { 30, 30, 30, 30, 30, 30 .... } /* those are hex 30's */

UTF-8表示'0'是0x30,而不是0x00。

因此,如果字符串包含散列的十六进制表示,那么您需要将byte[]转换为包含其十六进制表示的String,或者通过转换将字符串转换为byte[]每对字符为byte