程序猿必知必会[EP1]MD5算法

本文介绍了MD5算法的基础信息、实现原理、用途、安全性以及在Java中的应用。强调了MD5在安全性上的不足,如易受彩虹表攻击,并探讨了通过加盐提高MD5的安全性。此外,还提到了commons-codec库在MD5加密和加盐操作上的封装。
摘要由CSDN通过智能技术生成

1. 基础信息:

  • MD5算法,全称MD5信息摘要算法(MD5 Message-Digest Algorithm),是一种广泛使用的密码散列函数,可以产生128位 / 16字节的散列值(hash value),用于确保信息传输完成一致。
  • 将不定长的数据变为固定长度的数据,这是散列算法的基础原理。
  • MD5算法可破解,且无法防止碰撞(collision)。高度安全性的数据或是安全性认证,不适用MD5。

2. 算法基础实现:

  • 算法输入输出
    • 输入:任意长度数据;
    • 输出:固定长度128 bits的数据。
  • 内部逻辑
    • 填充
      • 将输入信息长度填充到N,此时N mod 512 = 448;
      • 当原输入信息长度本就满足N mod 512 = 448时,需填充512位;
      • 填充方法为先一个1,后续全0。
    • 记录信息长度
      • 剩余64位用于记录填充前输入信息的长度。
    • 初始化4个32位整数A、B、C、D
      • A = 0x67452301, B = 0xefcdab89, C = 0x98badcfe, D = 0x10325476;
    • 循环运算
      • 将ABCD和512位的数据经过运算,输出128位结果,根据数据位高低赋值于A、B、C、D中,继续循环直至结束。
      • PS:MD5具体的计算流程源码可见sun.security.provider.MD5
    • 输出由32位的A、B、C、D拼接而成的128位的结果

3. 用途:

  • 防止被篡改:
    • 比如发送一个电子文档,发送前先得出一个MD5值,在对方接收到文件后,核对MD5值,能避免文档被篡改;
    • 文件、程序下载同样,若下载到的程序被修改过,相应的MD5值就会发生变化。
  • 用于加密明文:
    • 例如数据库中存储用户信息如密码时,可以直接存储经过MD5加密的密码,用户校验可以直接在后台进行。这样做既保证了存储安全,又降低了数据丢失的损害。
  • 数字签名:
    • 这种做法类似于防止电子文档篡改,第三方机构能通过MD5对A签署的一份文件进行摘要,后续在证明一份电子文件是否是原文件时能进行直接比对。

4. 安全性:

  • MD5本身是不可逆的,所以严格上来说不算一种加解密方式。通常认为MD5的安全性很高,暴力破解的时间很长,但实际上单纯的使用MD5是很容易被破解。因为市面上存在大量的彩虹表,也就是相当于提前准备好了一套字符串-Hash值对应表,对于一些常规的字符段,很容易就能查到对应的MD5值。
  • 这也是市面上很多MD5破解网站的思路。

5. Java中使用MD5:

  • Java自身提供了一套完整的密码学架构JCA,通过JCA能直接使用到MD5或是SHA等信息摘要算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值