OMA DM1.2 md5 расчет дайджеста

Я реализую сервер для связи с использованием протокола 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 для возврата на устройство с использованием кода Java, где nonce - это строка Base64 в "NextNonce" в вызове выше:

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, или должна быть какая-то другая проблема?

1 ответ

Решение

Нашел мою ошибку. Одноразовый номер должен быть декодированным строковым значением Base64, а не строкой Base64.

nonce = new String(Base64.decodeBase64("RLLe7tWM313qHMq9ooUZUPJX0RqU9mEZuyoVF+jXhqQ="), "utf-8");
Другие вопросы по тегам