Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法从内存查看器中保护/隐藏Qt中的QNetworkAccessManager/QNetworkReply敏感信息?_C++_Api_Qt_Qtnetwork - Fatal编程技术网

C++ 有没有办法从内存查看器中保护/隐藏Qt中的QNetworkAccessManager/QNetworkReply敏感信息?

C++ 有没有办法从内存查看器中保护/隐藏Qt中的QNetworkAccessManager/QNetworkReply敏感信息?,c++,api,qt,qtnetwork,C++,Api,Qt,Qtnetwork,我试图使用GithubAPI解析私有GitHub repo中的一些数据,以连接并下载JSON格式的数据 一切正常,但我有一个大问题。作为私有repo,我不希望其他人访问私有repo密钥或JSON内容解析之类的敏感数据 这是我的密码: downloader.cpp #include "downloader.h" downloader::downloader() { connect(&manager, &QNetworkAccessManager::fi

我试图使用GithubAPI解析私有GitHub repo中的一些数据,以连接并下载JSON格式的数据

一切正常,但我有一个大问题。作为私有repo,我不希望其他人访问私有repo密钥或JSON内容解析之类的敏感数据

这是我的密码:

downloader.cpp

#include "downloader.h"

downloader::downloader()
{
    connect(&manager, &QNetworkAccessManager::finished,
            this, &downloader::downloadFinished);
}

void downloader::doDownload(const QUrl &url, int mode)
{
    download_Mode = mode;
    const QString username = "test";
    const QString token = "1234567890"
    const QByteArray basic_authorization = QByteArray("Basic ") + (username + ":" + token).toUtf8().toBase64();

    QNetworkRequest request(url);
    request.setRawHeader(QByteArrayLiteral("Authorization"), basic_authorization);
    request.setUrl(url);

    QNetworkReply *reply = manager.get(request);
    QEventLoop loop;
    connect(&manager, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);

    #if QT_CONFIG(ssl)
    connect(reply, &QNetworkReply::sslErrors, this, &downloader::sslErrors);
    #endif

    loop.exec();
}

bool downloader::isHttpRedirect(QNetworkReply *reply)
{
    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    return statusCode == 301 || statusCode == 302 || statusCode == 303
           || statusCode == 305 || statusCode == 307 || statusCode == 308;
}

void downloader::sslErrors(const QList<QSslError> &sslErrors)
{
#if QT_CONFIG(ssl)
    for (const QSslError &error : sslErrors)
        fprintf(stderr, "SSL error: %s\n", qPrintable(error.errorString()));
#else
    Q_UNUSED(sslErrors);
#endif
}

void downloader::downloadFinished(QNetworkReply *reply)
{
    QUrl url = reply->url();
    if (reply->error()) {
        fprintf(stderr, "Download of %s failed: %s\n",
                url.toEncoded().constData(),
                qPrintable(reply->errorString()));
    } else {
        if (isHttpRedirect(reply)) {
            fputs("Request was redirected.\n", stderr);
        } else {
            QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());
            QByteArray e_Content = doc.object().value("content").toString().toUtf8();
            QByteArray d_Content = QByteArray::fromBase64(e_Content);
        }
    }
    reply->deleteLater();
}
正在内存中显示我的数据,并且从不清除


提前感谢。

解析客户端上的私有信息看起来已经是一个糟糕的实现。您可以通过在运行时对内存数据进行加密来保护内存数据,但您必须自己编写。还有一个大警告:任何在个人电脑上运行的东西都可能被反向工程。即使你对它进行加密,如果有人非常想看到里面的东西,他也可以在加密之前解密或阅读。我知道一切都可以逆向工程。我只是想以某种方式隐藏那些显而易见的文字。还有,为什么在我的应用程序运行的整个过程中,Qnetwork中的所有数据都驻留在内存中?在C/C++中,当内存数据被释放时,数据本身在被重新分配和写入数据之前都会保持以前的状态。例如,当您的内存中有“ABCD”并且它被释放时,“ABCD”将保持在同一位置,然后有人分配新内存,并且它与“ABCD”重叠。在这种情况下,“ABCD”将被重写,例如“EFGH”,或者如果您编写“EFG”,它将变成“EFGD”(来自以前的数据)。根据您的提示,我通过在使用字符串值后重写字符串值来“隐藏”一些重要的字符串。最大的问题仍然是来自QNetwork的响应和头。下载完成后,我不知道如何重写/清除/归零reply和.setRawHeader的值。我不熟悉Qt及其网络,但经过一些研究,我相信Qt不会让您直接访问QNetworkReply中存储的数据,因此您无法归零。我已经读到,可以编写自己的回复类并使用它,但不能肯定。对于标题,afaik提供了QByteArray rawHeader,它具有成员函数“fill”。
request.setRawHeader(QByteArrayLiteral("Authorization"), basic_authorization);