2013-04-25 74 views
0

我在调试我自定义的OAuth实现(shindigspring-security-oauth库)。比较字节[]和String.getBytes()

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

狂欢

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

弹簧安全的OAuth

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

我也试过bytes[] b = str.getBytes();默认编码,但它不等于shindigHash时我比较了bshindigHash的元素。

编辑

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

str从哪里来?你如何比较字节数组?另外,sha()已被弃用。 – Antimony 2013-04-25 00:20:59

+0

@Antimony,根据你的“比较”问题进行更新。我宁愿保留相同的库,即不更新已弃用的sha(),因为多个项目使用它。 – 2013-04-25 00:24:39

回答

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 */ 

'0' 的UTF-8表示是的0x30,而不是0×00。

因此,如果字符串包含一个哈希的十六进制表示,那么你要么需要通过每对字符转换为bytebyte[]转换为字符串包含它的十六进制表示,或将字符串转换为byte[]

+0

如果'str'是签名?我的理解是'str.getBytes(“UTF-8”)'会将签名'str'返回为byte []? – 2013-04-25 00:38:23

+0

不是。让我试着澄清我的答案,这正是我想解释的。 – bmargulies 2013-04-25 00:39:40

+0

谢谢... < >< – 2013-04-25 01:33:25