MD-5

本文深入探讨了MD5加密算法的基本原理、用途及安全性,并展示了如何在iOS应用中实现MD5加密。重点阐述了MD5在验证数据完整性和密码存储中的作用,同时介绍了实际应用中的代码实现,以及MD5碰撞的概念与解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件开发过程中,对数据进行加密是保证数据安全的重要手段,常见的加密有Base64加密和MD5加密。Base64加密是可逆的,MD5加密目前来说一般是不可逆的。我们在开发一款iOS App过程中,对于发送的请求,其中有个“sign”的字段,这个key对应的value是MD5加密的字段.

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。

MD5的用处

  无论是密码记录用户验证还是文件完整性存储,笼统的说就是验证数据是否匹配。数据库中使用明文记录密码明显是不可行的,但是使用 MD5 就不同了,MD5 算法的高明之处就是不可逆,因为在算法中采取了抽样、分组等等算法,他不会将数据的所有内容加入运算,而是根据规则选择指定内容运算,所以,同样的字符串或者内容进行 MD5 运算的时候,得到的结果也是一样的,所以使用 MD5 记录密码,可以很有效的解决一些明文带来的问题,至于验证数据准确性就更加不用说了。


MD5 算法流程

      MD5 算法将输入的信息进行分组,每组512 位(64个 字节),顺序处理完所有分组后输出128 位结果。
将这128 位用十六进制表示便是常见的32 字符的MD5 码,而所谓的16 字符的MD5 码,其实是这32 字符
中间的16 个字符。
      在每一组消息的处理中,都要进行4 轮、每轮16 步、总计64 步的处理。其中每步计算中含一次左循
环移位,每一步结束时将计算结果进行一次右循环移位。


iOS实现方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<span style= "font-size:12px;" >#import <CommonCrypto/CommonDigest.h>
- (NSString *)md5:(NSString *)str
{
     const char *cStr = [str UTF8String];
     unsigned char result[16];
     CC_MD5(cStr, strlen (cStr), result); // This is the md5 call
     return [NSString stringWithFormat:
         @ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" ,
         result[0], result[1], result[2], result[3],
         result[4], result[5], result[6], result[7],
         result[8], result[9], result[10], result[11],
         result[12], result[13], result[14], result[15]
     ];
}</span>

其中%02x是格式控制符:‘x’表示以16进制输出,‘02’表示不足两位,前面补0;如‘f’输出为0f,‘1f3’则输出1f3;本来一般的都会介绍到这里就完了,我想多介绍一下代码中result是个字符数组,那为什么是[16]呢,这是因为MD5算法最后生成的是128位,而在计算机的最小存储单位为字节,1个字节是8位,对应一个char类型,计算可得需要16个char。所以result是[16]。那么为什么输出的格式一定是%02x呢,而不是其它呢。这也是有原因的:因为约定MD5一般是以16进制的格式输出,那么其实这个问题就转换为把128个0和1以16进制来表示,每4位二进制对应一个16进制的元素,则需要32个16进制的元素,如果元素全部为0,放到char的数组中,正常是不会输出,如00001111,以%x输出,则是f,那么就会丢失0;但如果以%02x表示则输出结果是0f,正好是转换的正确结果。

所以以上就是char[16]和%02x的来历。

至于人们说的16位MD5加密,其实是这样的:举例如果产生的MD5加密字符串是:01234567abcdefababcdefab76543210,则16位的MD加密字符是abcdefababcdefab,也就是只是截取了中间的16位。实际上这个操作已经不是MD5加密算法所包括的,而应当是对MD5加密算法结果的二次处理。其它的64位和大小写什么的,都属于对MD5算法结果的二次处理。因为MD5算法产生的结果就是128bit,128个二进制数字。

md5 碰撞

MD5 相同的情况叫做“碰撞”,现在网络中已经出现了两个相同的 MD5 可执行文件,你可能会问,MD5 相同到底会造成什么问题。

  一些网盘使用的是 MD5 的方式来验证文件是否已经被上传过,如果上传过就直接告诉用户上传过就好了,也就不用再次上传去占用而外的空间,假设 Win9 现在发布了,我马上就构造一个假的包含病毒的但是 MD5 和官方镜像相同的安装镜像放置到 A 网盘,A 网盘使用 MD5 验证数据是否相同,那么现在的问题就是,用户下载的全部都是我制作的光盘,而非微软官方的。当然,这种构造的方法仍然是非常高级的东西,不是很容易能够做到的。

MD5 会发生碰撞已经是被发现的了,但是我们需要担心吗,我要说的是,目前为止还不用担心,首先要构造 MD5 碰撞是非常难的,理论上字符串越长 MD5 就越不可能相同,并且借助 SHA-1 算法的帮助,双管齐下,也就没有太大问题了,所以现在 MD5 还没有轮到被弃用的时候。

  SHA-1 会碰撞吗

  SHA-1 也会发生碰撞,但是几率比 MD5 小的多。

  怎样解决碰撞

  解决碰撞其实可以通过 MD5 和 SHA-1 结合使用来实现。我是这样做的,首先将文件 A 的 MD5 值记为 B 再把 A 的 SHA-1 记为 C,之后用将 B 和 C 相加之后再次运算 MD5 值就好了,MD5 值碰撞的几率已经很小,再结合 SHA-1 的话,基本上就不会发生碰撞的问题出现了。在新的算法普及之前,MD5 还是可以继续使用的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值