我正在调试OAuth(shindig
和spring-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();
作为默认编码,但是当我比较shindigHash
和b
的每个元素时,它都不等于shindigHash
。
修改
for j = 0 .. b.length // same as shindigHash length
print shindigHash[j] ... b[j]
end
visually compare results
答案 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
。