Я работал с 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);
}
Любая помощь в этом отношении будет принята с благодарностью.
Похоже, проблема заключается в хранении 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);
}
Надеюсь, это поможет любому, кто сталкивается с той же проблемой.