C++ 有没有办法从内存查看器中保护/隐藏Qt中的QNetworkAccessManager/QNetworkReply敏感信息?
我试图使用GithubAPI解析私有GitHub repo中的一些数据,以连接并下载JSON格式的数据 一切正常,但我有一个大问题。作为私有repo,我不希望其他人访问私有repo密钥或JSON内容解析之类的敏感数据 这是我的密码: downloader.cppC++ 有没有办法从内存查看器中保护/隐藏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
#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);