今天上午一直在翻OMA的SyncML 1.1 协议,卡在用户验证的地方,按照协议上的例子怎么算也算不出来预期的结果。
根据协议正文,MD5验证的算法很简单,用伪代码来表示就是这样:
result = base64( md5( base64( md5( username + ":" + password)) + ":" + nonce) );
用php写出来就是:
function computehash($username, $password, $nonce){
return base64_encode(pack('H*', md5(base64_encode(pack('H*', md5("$username:$password"))) . ":$nonce")));
}
return base64_encode(pack('H*', md5(base64_encode(pack('H*', md5("$username:$password"))) . ":$nonce")));
}
但是用协议里指定的参数:
username="Bruce1" , password="OhBehave" , nonce="Nonce"
无论如何也算不出协议里给的值"Zz6EivR3yeaaENcRN6lpAQ==", 而是 "+MEIKFrF8Qdou2B1H2YmXw=="
一气之下用 .NET 写了一个,结果也是相同的。
Code
经过多方搜索,终于在 这里 发现了原因:协议写错了。正确的参数应该是:
username="Bruce2" , password="OhBehave" , nonce="Nonce"
我Faint…