MD5理解和基础应用场景

MD5是什么

message-digest algorithm 5(信息-摘要算法)。经常说的“MD5加密”,就是它→信息-摘要算法。

在下载一下东西时,经常在一些压缩包属性里,看到md5值。而且这个下载页面,很可能会在某一个地方,写了一句,此文件的MD5值为XXXXXXXXX。这有什么作用呢?

白话白话:md5,其实就是一中算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串,基本上是唯一的。把一个任意长度的字节串变换成⼀定⻓度的⼗六进制数字串。
目的是让⼤容量信息在⽤数字签名软件签署私⼈密钥前被”压缩”成⼀种保密的格式。

所以,有人修过压缩包后,就会生成新的串,这时就可以拿网站提供的串和新生成的串对比,如果不同,那就是被人修过过了。

应用场景

1、一致性验证:
从网上下载⽂件,软件,各种资料的时候,有些文件会提供MD5对照信息。利⽤MD5校验软件来核对下载的⽂件,以此观测下载得到的文件与传送者是否相符。
利用MD5算法来进⾏文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等⽅方⾯面

2、数字证书:
对一段Message(字节串)产生fingerprint(指纹),以防止被”篡改”。举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的”抵赖”,这 就是所谓的数字签名应用。

3、安全访问认证:
用于操作系统的登陆认证上。当用户登录的时候,系统把⽤户输入的密码进⾏MD5 Hash运算,然后再去和保存在文件系统中的MD5值进⾏比较, 进⽽确定输⼊的密码是否正确。
通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免⽤户的密码被具有系统管理员权限的用户知道。指纹解锁一样可以MD5保存

加密和摘要,是不一样的

加密后的消息是完整的;具有解密算法,得到原始数据;

摘要得到的消息是不完整的;通过摘要的数据,不能得到原始数据;

MD5长度

有人说md5,128位,32位,16位,到底md5多长?

md5的长度,默认为128bit,也就是128个0和1的二进制串。

这样表达是很不友好的。

所以将二进制转成了16进制,每4个bit表示一个16进制,

所以128/4 = 32 换成16进制表示后,为32位了。
这里写图片描述

为什么网上还有md5是16位的呢?

网上有很多帖子,md5 32位 16位 加密 区别。

仔细观察admin生成的32位和16位的md5值……

16位 小写 ac59075b964b0715
32位 小写 202cb962ac59075b964b07152d234b70

其实16位的长度,是从32位md5值来的。是将32位md5去掉前八位,去掉后八位得到的。

MD5的作用

①一致性检验,最上面那个例子

②数字签名,还是最上面那个例子。只是把md5看出了一个指纹,按了个手印说明独一无二了。

③安全访问认证,这个就是平时系统设计的问题了。

在用户注册时,会将密码进行md5加密,存到数据库中。这样可以防止那些可以看到数据库数据的人,恶意操作了。

不可破解?

md5是不可逆的,也就是没有对应的算法,从生产的md5值逆向得到原始数据。

但是如果使用暴力破解,那就另说了。
如果要求不高,比如保存个密码啥的,问题不大。为了防止破解,加个 Salt 最好。

resultStr = [[NSString stringWithFormat:@"%@",@"加盐"] MD5Hash];

md5是唯一的吗?

MD5论坛讨论,更容易理解
md5作为数据库中的主键可行吗?这就涉及到一个问题,md5值是唯一的吗?答案是,不唯一。

也就是一个原始数据,只对应一个md5值;

但是一个md5值,可能对应多个原始数据。

OC

- (NSString *)MD5Hash {

    CC_MD5_CTX md5;
    CC_MD5_Init (&md5);
    CC_MD5_Update (&md5, [self UTF8String], (CC_LONG)[self length]);

    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5_Final (digest, &md5);
    NSString *s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                   digest[0],  digest[1], 
                   digest[2],  digest[3],
                   digest[4],  digest[5],
                   digest[6],  digest[7],
                   digest[8],  digest[9],
                   digest[10], digest[11],
                   digest[12], digest[13],
                   digest[14], digest[15]];

    return s;

}

参考这位大神,非常感谢,记录理解下

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在对报文进行 HASH 计算的实验中,我们主要使用了 SHA1、SHA256、MD5 等常见的 HASH 函数。这些函数可以将任意长度的输入报文转换为固定长度的输出值,并且具有不可逆性和唯一性。 在实验中,我们首先要了解这些 HASH 函数的使用方法和特点。例如,SHA1 和 MD5 的输出长度分别为 160 位和 128 位,而 SHA256 的输出长度为 256 位。因此,SHA256 的安全性更高,但是计算速度也更慢。 在实验中,我们可以使用各种编程语言和工具来实现这些 HASH 函数的计算。例如,在 Python 中,我们可以使用 hashlib 模块来实现 SHA1、SHA256 和 MD5 的计算。具体代码如下: ```python import hashlib # 计算 SHA1 Hash 值 message = b"Hello, world!" sha1 = hashlib.sha1() sha1.update(message) print("SHA1 Hash: ", sha1.hexdigest()) # 计算 SHA256 Hash 值 message = b"Hello, world!" sha256 = hashlib.sha256() sha256.update(message) print("SHA256 Hash: ", sha256.hexdigest()) # 计算 MD5 Hash 值 message = b"Hello, world!" md5 = hashlib.md5() md5.update(message) print("MD5 Hash: ", md5.hexdigest()) ``` 在实验中,我们还需要了解 HASH 函数的一些应用场景。例如,我们可以使用 HASH 函数来验证数据的完整性和真实性。在文件传输过程中,我们可以计算文件的 HASH 值并将其与接收方计算的 HASH 值进行比较,以确保文件在传输过程中没有被篡改。 总的来说,HASH 函数是密码学中非常重要的一部分。通过实验,我们可以更好地理解 HASH 函数的特点和应用场景,并掌握计算 HASH 值的方法和技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值