Невозможно реплицировать выходные данные SHA1 и Base64 примера API Onvif

Я работал с C ++ / Qt для разработки клиента ONVIF, для связи с камерами в данной сети через запросы и ответы XML / SOAP.

В настоящее время я поражен, пытаясь реализовать механизм безопасности для запросов мыла.
Со страницы 35 Руководство по API.

У нас есть пример ..

Nonce — LKqI6G / AikKCQrN0zqZFlg ==
Дата — 2010-09-16T07: 50: 45Z
Пароль — пароль пользователя
Результирующий дайджест — tuOSpGlFlIXsozq4HFNeeGeFLEI =

«Итоговый дайджест» получается путем вычисления этой формулы

Дайджест = B64ENCODE (SHA1 (B64DECODE (Nonce) + Дата + Пароль))

У меня возникли проблемы с использованием как онлайн-инструментов, так и конвертера, а также этого примера Pt для Qt, который я написал.

#include <QCoreApplication>
#include <QString>
#include <QCryptographicHash>
#include <QDebug>

QString base64_encode(QString string);
QString base64_decode(QString string);

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QString nonce ="LKqI6G/AikKCQrN0zqZFlg==";
QString date = "2010-09-16T07:50:45Z";
QString pass = "userpassword";

QString nonce_dec = base64_decode(nonce);

QString res = nonce_dec+date+pass;
QByteArray resBytes(res.toStdString().c_str());
QCryptographicHash sha(QCryptographicHash::Sha1);
sha.addData(resBytes);
qDebug()<<"Resultant Hash is ";
QString resHash = base64_encode(sha.result());
qDebug()<<resHash ;

return a.exec();
}

QString base64_encode(QString string){
QByteArray ba;
ba.append(string);
return ba.toBase64();
}

QString base64_decode(QString string){
QByteArray ba;
ba.append(string);
return QByteArray::fromBase64(ba);
}

Любая помощь в этом отношении будет принята с благодарностью.

0

Решение

Похоже, проблема заключается в хранении QString, не использующем кодировку UTF-8 по умолчанию.

Я получил его для работы с этим измененным фрагментом.

#include <QCoreApplication>
#include <QString>
#include <QCryptographicHash>
#include <QDebug>

QString base64_encode(QByteArray ba);
QByteArray base64_decode(QByteArray ba);

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QString nonce ="LKqI6G/AikKCQrN0zqZFlg==";
QString date = "2010-09-16T07:50:45Z";
QString pass = "userpassword";

QByteArray nonce_dec = base64_decode(nonce.toUtf8());

QByteArray res = nonce_dec+QByteArray(date.toUtf8())+QByteArray(pass.toUtf8());
QByteArray resBytes(res.toStdString().c_str());
QCryptographicHash sha(QCryptographicHash::Sha1);
sha.addData(resBytes);
QByteArray shaBytes = sha.result();
qDebug()<<"Resulting Hash is ";
QString resHash = base64_encode(shaBytes);
qDebug()<<resHash ;
return a.exec();
}

QString base64_encode(QByteArray ba){
return ba.toBase64();
}

QByteArray base64_decode(QByteArray ba){
return QByteArray::fromBase64(ba);
}

Надеюсь, это поможет любому, кто сталкивается с той же проблемой.

0

Другие решения


По вопросам рекламы [email protected]