无法复制 Onvif API 示例的 SHA1 和 Base64 输出
Unable to replicate SHA1 and Base64 Output of Onvif API Example
我一直在使用 C++/Qt 设计 ONVIF 客户端,通过 XML/SOAP 请求和响应与给定网络中的摄像头通信。
我目前正在尝试为 soap 请求实施安全机制。
来自API guide.
的第35页
我们有例子..
Nonce – LKqI6G/AikKCQrN0zqZFlg==
Date – 2010-09-16T07:50:45Z
Password – userpassword
Resulting Digest – tuOSpGlFlIXsozq4HFNeeGeFLEI=
"resulting digest"是通过这个公式计算得到的
Digest = B64ENCODE( SHA1( B64DECODE( Nonce ) + Date + Password ) )
我在使用在线工具和转换器以及我编写的这个 Qt 示例 POC 时遇到了问题。
#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);
}
希望对遇到同样问题的人有所帮助。
我一直在使用 C++/Qt 设计 ONVIF 客户端,通过 XML/SOAP 请求和响应与给定网络中的摄像头通信。
我目前正在尝试为 soap 请求实施安全机制。 来自API guide.
的第35页我们有例子..
Nonce – LKqI6G/AikKCQrN0zqZFlg==
Date – 2010-09-16T07:50:45Z
Password – userpassword
Resulting Digest – tuOSpGlFlIXsozq4HFNeeGeFLEI=
"resulting digest"是通过这个公式计算得到的
Digest = B64ENCODE( SHA1( B64DECODE( Nonce ) + Date + Password ) )
我在使用在线工具和转换器以及我编写的这个 Qt 示例 POC 时遇到了问题。
#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);
}
希望对遇到同样问题的人有所帮助。