Как получить Результирующий Disgest с WS-UsernameToken? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть следующая документация из Руководства для программистов ONVIF

onvif0

В настоящее время я пытаюсь воспроизвести Результирующий дайджест с использованием тех же записей, что и в руководстве ...

Вот мой код:

private string GenerateHashedPassword(string nonce, string created, string password)
    {
        byte[] nonceBytes = Encoding.UTF8.GetBytes(nonce);
        byte[] createdBytes = Encoding.UTF8.GetBytes(created);
        byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
        byte[] combined = new byte[createdBytes.Length + nonce.Length + passwordBytes.Length];
        //N-C-P
        Buffer.BlockCopy(nonceBytes, 0, combined, 0, nonceBytes.Length);
        Buffer.BlockCopy(createdBytes, 0, combined, nonceBytes.Length, createdBytes.Length);
        Buffer.BlockCopy(passwordBytes, 0, combined, nonceBytes.Length + createdBytes.Length, passwordBytes.Length);

        return Convert.ToBase64String(SHA1.Create().ComputeHash(combined));
    }

Когда я использую свою функцию:

string digestPassword = GenerateHashedPassword("LKqI6G/AikKCQrN0zqZFlg==","2010-09-16T07:50:45Z","userpassword");//Values from guide

Моя функция не возвращает тот же результат, что и в руководстве ...

Что не так с моей функцией ??Почему я не могу получить тот же вывод ??

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Благодаря помощи @Ottavio я понял, что не расшифровал одноразовый номер до хэширования его с остальными записями ... Код, который я использовал для получения хорошего результата:

private string GenerateHashedPassword(string nonce, string created, string password)
    {
        byte[] nonceBytes = Convert.FromBase64String(nonce);
        byte[] createdAndPasswordBytes = Encoding.UTF8.GetBytes(created + password);
        byte[] combined = new byte[nonceBytes.Length + createdAndPasswordBytes.Length];

        Buffer.BlockCopy(nonceBytes, 0, combined, 0, nonceBytes.Length);
        Buffer.BlockCopy(createdAndPasswordBytes, 0, combined, nonceBytes.Length, createdAndPasswordBytes.Length);

        return Convert.ToBase64String(SHA1.Create().ComputeHash(combined));
    }
0 голосов
/ 15 мая 2018

Правильные шаги в псевдокоде:

1. n = base64decode ("LKqI6G/AikKCQrN0zqZFlg==")
2. s = sha1 (n + "2010-09-16T07:50:45Zuserpassword")
3. resulting_digest = base64encoder (s)

Для справки: промежуточные значения:

1. n = '\x2c\xaa\x88\xe8\x6f\xc0\x8a\x42\x82\x42\xb3\x74\xce\xa6\x45\x96'
2. s = '\xb6\xe3\x92\xa4\x69\x45\x94\x85\xec\xa3\x3a\xb8\x1c\x53\x5e\x78x\67\x85\x2c\x42'

Вы не публикуете полученный результат, но я думаю, что вы используете версию nonce в кодировке base64 в двоичной строке, которую вы хэшируете с помощью sha1.

...