前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >软件开发|关于官网上的MD5值问题的思考

软件开发|关于官网上的MD5值问题的思考

原创
作者头像
Aion
发布2024-10-17 21:33:27
360
发布2024-10-17 21:33:27
举报
文章被收录于专栏:开发运维工程师

引言

在GitHub上以及一些官方网站提供的下载包,文件的MD5值通常不是由GitHub平台直接生成的,而是由文件的所有者或上传者在本地生成,然后作为文件完整性验证的一部分上传到GitHub。MD5值是一种哈希值,用于验证文件的唯一性和完整性。一般我们都会在一些官方网站看到这些MD5值,甚至一些其他算法命名的签名📄,例如GnuPG签名值(或文件等)。

文件的唯一性完整性是确保文件在存储、传输和使用过程中保持原始状态不被修改、破坏。

验证文件的唯一性

文件名比较

最简单、最普遍的方式是直接比较文件的名称。不过呢,这种方式并不可靠,因为文件名可以轻易地被更改,而且不同的文件可能具有相同的文件名。

文件内容哈希

通过计算文件内容的哈希值(如MD5SHA-1SHA-256等),可以得到一个固定长度的唯一标识。如果两个文件的哈希值相同,则它们的内容几乎可以确定是相同的。

这种方法比文件名比较更为可靠,因为哈希值是根据文件内容生成的,而且不同的文件内容几乎不可能产生相同的哈希值(尽管存在哈希碰撞的可能性,但概率极低)。

例如从Nacos的官网(https://nacos.io/en/download/nacos-server/#stable-versions)下载安装包时可以根据MD5值比较确认文件的完整性。

文件签名

使用数字签名技术,可以对文件内容进行签名,并附加到文件上。验证者可以使用公钥来验证签名的有效性,从而确保文件内容的唯一性和未被篡改。

例如在MySQL的官网(https://dev.mysql.com/downloads/mysql/)中我们可以看到有两种文件签名方式:哈希值签名GnuPG签名,kafka使用了ascsha512算法签名。

验证文件的完整性

哈希值比较

与验证文件唯一性类似,通过计算文件的哈希值,并将其与预先计算好的哈希值进行比较,可以验证文件的完整性。如果哈希值相同,则表明文件未被篡改或损坏。

校验和

校验和是一种根据文件内容生成的唯一标识,用于验证文件的完整性。常见的校验和算法有CRC32等。通过计算文件的校验和,并与预先计算好的校验和进行比较,可以验证文件的完整性。

文件大小比较

通过比较文件的大小,可以初步判断文件是否发生了改变。如果文件的大小与之前记录的值不一致,则可能表明文件被篡改或损坏。然而,这种方法并不可靠,因为文件大小可以被轻易地更改。

文件日期比较

通过比较文件的修改日期或创建日期,可以判断文件是否发生了改变。然而,这种方法同样存在局限性,因为日期信息也可以被更改。

文件权限检查

通过检查文件的权限设置,可以确定文件是否被非法访问或修改。如果文件的权限设置不正确或与预期不一致,则可能表明文件存在风险。

元数据验证

元数据是描述文件属性的信息,包括文件的创建者、创建时间、修改者、修改时间等。通过比较文件的元数据,可以验证文件的真实性和修改历史。

如何生成MD5值

在开发中,可以使用多种编程语言和工具来生成MD5值。例如,在Python中,可以使用hashlib库;在Java中,可以使用MessageDigest类;在C++中,可以编写自己的MD5算法实现或使用现有的库。

Python 语言

hashlib 是 Python 的一个内置库,用于提供常见的消息摘要算法,也称为哈希算法,使用其他第三方库也可以实现效果。

代码语言:javascript
复制
>>> import hashlib
>>>
>>> md5_hash = hashlib.md5()
>>> md5_hash.update(b'Hello, world!')
>>> md5_result = md5_hash.hexdigest()
>>> print(f'MD5: {md5_result}')
MD5: 6cd3556deb0da54bca060b4c39479839
>>>
>>>

Java语言

在Java中,MessageDigest类是java.security包的一部分,它提供了信息摘要算法的功能,包括MD5。信息摘要是一种单向哈希函数,它接收任意大小的数据输入,并输出固定大小的哈希值(摘要)。MD5算法是这些哈希函数之一,它产生一个128位(16字节)的哈希值,通常表示为32位的十六进制数。

代码语言:javascript
复制
package com.aion.tooljdk;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * <p> JdkMessageDigestTest </p>
 * class
 *
 * @author Aion
 * @version v1.0.0
 * @description TODO
 * @since 2024/10/17 下午8:55
 */
public class JdkMessageDigestTest {
    public static void main(String[] args) {
        try {
            // 获取MD5算法的MessageDigest实例
            MessageDigest md = MessageDigest.getInstance("MD5");

            // 更新数据(需要将字符串转换为字节数组)
            md.update("Hello, world!".getBytes());
            // 计算哈希值(返回一个字节数组)
            byte[] digest = md.digest();

            // 将字节数组转换为十六进制字符串
            BigInteger number = new BigInteger(1, digest);
            StringBuilder hexString = new StringBuilder(number.toString(16));

            // 如果哈希值的长度不是32位,则前面补0
            while (hexString.length() < 32) {
                hexString.insert(0, '0');
            }

            // 返回哈希值的十六进制字符串表示
            System.out.println(hexString);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}

shell语言

在Shell语言中比较便捷,可以直接使用MD5的命令来针对字符串、文件生成MD5值。

代码语言:javascript
复制
Aion logs $ md5 -s 'Hello, world!'
MD5 ("Hello, world!") = 6cd3556deb0da54bca060b4c39479839
Aion logs $

SQL语言

在SQL中,MD5函数非常简单,直接接受一个字符串作为输入,并返回其MD5哈希值。下面是在MySQL和PostgreSQL中的MD5函数的使用。

代码语言:javascript
复制
select md5('Hello, world!'), version();

其他语言不在赘述。

如何验证文件值

从官方网站下载所需要验证的文件,从上面的方法中生成MD5值,或者使用与上传者相同的工具和方法,对下载的文件内容生成MD5值。将生成的MD5值与上传者提供的MD5值进行比较。如果两者相同,则文件在传输过程中未被篡改,保持了完整性。相反,则文件已经被篡改。

后话

MD5算法虽然广泛用于文件完整性验证,但由于其固有的碰撞性(即不同的文件可能产生相同的MD5值),它并不适合用于安全性要求较高的场景。对于需要更高安全性的场景,建议使用更安全的哈希算法,如SHA-256或SHA-3。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 验证文件的唯一性
    • 文件名比较
      • 文件内容哈希
        • 文件签名
        • 验证文件的完整性
          • 哈希值比较
            • 校验和
              • 文件大小比较
                • 文件日期比较
                  • 文件权限检查
                    • 元数据验证
                    • 如何生成MD5值
                      • Python 语言
                        • Java语言
                          • shell语言
                            • SQL语言
                            • 如何验证文件值
                            • 后话
                            相关产品与服务
                            云数据库 MySQL
                            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档