概念作用及原理
md5sum是一种常用的哈希算法,用于计算数据的MD5哈希值。MD5(Message Digest Algorithm 5)是一种广泛使用的加密散列函数,用于将任意长度的数据映射为固定长度的哈希值(通常是128位)。这个哈希值是唯一的,即使输入的数据只改变一个字节,其生成的哈希值也会完全不同。
MD5算法主要用于验证文件的完整性和一致性,以及在网络传输中检测数据是否被篡改。通过计算文件的MD5哈希值并将其与预先计算好的哈希值进行比对,可以确定文件是否被修改。在数字取证、密码存储等领域也有广泛应用。
md5sum的作用主要有两个方面:
-
文件完整性验证:通过计算文件的MD5哈希值,可以验证文件的完整性。如果文件在传输或存储过程中被篡改,其MD5哈希值会发生变化,从而可以检测到文件是否被修改。
-
数据校验:通过计算数据的MD5哈希值,可以确保数据的一致性。在网络传输中,发送方和接收方可以计算数据的MD5哈希值,并将其进行比对,以确保数据的正确传输和接收。
MD5(Message Digest Algorithm 5)算法的计算原理如下:
-
初始化:将一系列常量保存为初始哈希值。
-
填充数据:将要计算的数据进行填充,使得数据长度对512位取模后余数等于448。填充通常包括在数据末尾添加一个1和若干个0。
-
追加长度信息:将原始数据的长度(以二进制表示)追加到填充后的数据末尾,以确保长度信息参与哈希计算。
-
分块处理:将填充后的数据分割为512位(64字节)的多个块。
-
初始化哈希值:将初始哈希值(A、B、C、D)复制到临时变量中。
-
处理块数据:对每个块进行一系列的操作,包括置换、位运算和非线性函数等。
-
更新哈希值:将每个块处理后的结果与当前的哈希值进行计算,得到新的哈希值。
-
输出结果:将最终的哈希值以指定的格式输出。
通过这种计算方式,MD5算法将任意长度的数据映射为一个唯一的128位哈希值,这个哈希值通常以16进制或32位字符串形式表示。即使数据发生微小改动,其哈希值也会完全不同,从而可以检测到数据的篡改。需要注意的是,由于MD5存在碰撞等安全性问题,现在已不推荐用于密码存储等安全敏感领域。
Qt代码实现
QString MyVersion::getMD5Sum()
{
QFile sourceFile(QCoreApplication::applicationFilePath());
qint64 fileSize = sourceFile.size();
const qint64 bufferSize = 10240;
if (sourceFile.open(QIODevice::ReadOnly)) {
char buffer[bufferSize];
int bytesRead;
int readSize = qMin(fileSize, bufferSize);
QCryptographicHash hash(QCryptographicHash::Md5);
while (readSize > 0 && (bytesRead = sourceFile.read(buffer, readSize)) > 0) {
fileSize -= bytesRead;
hash.addData(buffer, bytesRead);
readSize = qMin(fileSize, bufferSize);
}
sourceFile.close();
QString md5Res = QString(hash.result().toHex());
return md5Res;
}
return QString();
}
用作软件序列号
最后,我们取md5值的后四个字节作为软件的序列号。