1

前言

我正在开发一个需要在两台机器(客户端和服务器)之间传输 FTP 文件的项目。我想通过比较客户端上生成的 MD5 校验和与服务器上生成的校验和来验证传输后文件的完整性。我使用 Qt 的 QCryptographicHash 类编写了一个命令行程序来执行此操作。减去错误检查,这是完整的代码:

最小的工作示例

#include <QCoreApplication>
#include <QByteArray>
#include <QFile>
#include <QCryptographicHash> 
#include <QTextStream>
#include <QStringList>

int main (int argc, char* argv[]) {
    QCoreApplication app(argc, argv);
    QTextStream cout(stdout, QIODevice::WriteOnly);
    QStringList arglist = app.arguments();

    QFile file(arglist.at(1));
    if(!file.open(QIODevice::ReadOnly)){
        /*error checking*/
    }


    QCryptographicHash cryptoHash(QCryptographicHash::Md5);
    while(!file.atEnd()){
        cryptoHash.addData(file.readLine());
    }

    QByteArray hashByteArray = cryptoHash.result();

    cout << hashByteArray.toHex() <<endl;
    file.close();
    return 0;
}

问题

在任何机器上,此代码都会给出任何输入文件的可重复 MD5 散列。但是,在我的客户端上散列时为同一文件生成不同的散列值,而不是在我的服务器上散列时生成的散列值不同。我一直在努力解决这个问题,但似乎无法确定为什么这些哈希不匹配。我最后的想法是,这可能是与架构相关的问题,正如这篇 SO 帖子中所讨论的那样。但是,就我而言,我使用的是 Qt 的 MD5 散列实现,所以我想确保在我放弃 Qt 的方法或修改它们的源代码(这里是md5.h在这里md5.cpp,顺便说一句)。

机器细节。服务器:CentOS 5.8 64 位。客户端:Win7 64 位,但在 Windows 上,此应用程序是使用 Qt 的 32 位版本编译的,并且是 32 位应用程序。

顺便说一句,我打算同时分发我的应用程序的 32 位和 64 位版本。如果它与架构相关并且我被困在使用 Qt 的源代码,我该如何调和这个问题?

编辑 1:我忘了提到我正在通过 FTP 以二进制模式传输所有文件,并且文件大小在客户端和服务器上匹配。我最初确信这是一个行尾问题,但似乎并非如此,因为即使在二进制模式 FTP 传输中我也遇到了这个问题。

4

2 回答 2

1

除非您已经拥有它,否则无需处理内容部分。

QCryptographicHash hash(QCryptographicHash::Md5);     
QFile file(path);
 if (file.open(QIODevice::ReadOnly))
    {

       if ( hash.addData(&file) )
           return hash.result().toHex();


    }
于 2016-02-10T08:58:39.640 回答
0

您不应该使用 readline 更好的方法是在字节数组中读取它,然后像这样计算哈希

QFile file("/home/opc0de/somefile.dat");

    if (file.open(QIODevice::ReadOnly)) {
        QByteArray fileData = file.readAll();
        QByteArray hashData = QCryptographicHash::hash(fileData, QCryptographicHash::Md5);

        qDebug() << hashData.toHex();
    }

希望能帮助到你。

于 2012-10-31T07:13:53.263 回答