1

我正在使用 OMA DM 1.2 SyncML 协议实现通信服务器,并参考OMA 设备管理安全文档。我遇到了身份验证问题。客户端向服务器发送挑战:

<Chal>
    <Meta>
        <Format xmlns="syncml:metinf">b64</Format>
        <Type xmlns="syncml:metinf">syncml:auth-md5</Type>
        <NextNonce xmlns="syncml:metinf">RLLe7tWM313qHMq9ooUZUPJX0RqU9mEZuyoVF+jXhqQ=</NextNonce>
    </Meta>
</Chal>

然后我计算 md5-digest 以使用 java 代码返回到设备,其中 nonce 是上述挑战中“NextNonce”中的 Base64 字符串:

MessageDigest digest = MessageDigest.getInstance("MD5");
String usrPwd = username + ":" + password;
String usrPwdHash = Base64.encodeBase64String(digest.digest(usrPwd.getBytes("utf-8")));
String usrPwdNonce = usrPwdHash + ":" + nonce;
String usrPwdNonceHash = Base64.encodeBase64String(digest.digest(usrPwdNonce.getBytes("utf-8")));
return usrPwdNonceHash;

然后将此哈希返回到设备,如下所示:

<Cred>
        <Meta>
              <ns2:Type>syncml:auth-md5</ns2:Type>
              <ns2:Format>b64</ns2:Format>
        </Meta>
        <Data>QpbMtvvfNGRIavJ0jqcxaw==</Data>
</Cred>

但设备返回状态 401 和新挑战。我计算 md5-hash 的方式有问题还是必须有其他问题?

4

1 回答 1

0

发现我的错误。nonce 应该是解码后的 Base64 字符串值,而不是 Base64 字符串。

nonce = new String(Base64.decodeBase64("RLLe7tWM313qHMq9ooUZUPJX0RqU9mEZuyoVF+jXhqQ="), "utf-8");
于 2013-05-23T11:44:53.517 回答