无法复制 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);
}

希望对遇到同样问题的人有所帮助。