MD5加密算法及Java实现

MD5加密算法及Java实现

上个学期在学数据库的时候,大作业是用Java Web+MySQL实现一个简易的系统,其中老师就提到了MD5算法,用来将用户提交的密码进行加密后放在数据库中,以防被泄露。在网页上进行表单校验时,也是将数据库中用户的散列值与用户提交的密码进行映射后得到的散列值进行比对。java.security中提供了一个MessageDigest类,提供了很多此类密码散列函数,如MD5和SHA(安全散列算法 Secure Hash Algorithm)等,所以只需要调用即可,不用亲自实现。
这个暑假小学期学区块链也用到了散列算法,在比特币系统中使用的是SHA-256算法,安全性更高,为了理解这些散列算法,我选择其中相对比较简单的MD5来学习一下。

算法简介

MD5算法(Message Digest Algorithm)是一种被广泛使用的密码散列函数,其输入是任意长度的字符串,输出是这个字符串的128位(16字节)散列值(hash value)。

散列算法的本质是定义了两个集合之间的某个映射:φ:A→B
其中A是全部字符串的集合,B是全部128位二进制数的集合
显然A是无限集而B是有限集,所以理论上在A中存在两个元素,它们映射到B中的同一值,也即它们发生了碰撞,但在现实中实际使用时是用不到这么多输入的,所以碰撞的概率很低,可以忽略不计。

值得注意的是,MD5算法如今已经不再认为是一个安全的算法。有的网站提供MD5的破解方法,使用的原理是彩虹表,也就是将各个可能的输入与其对应的散列值存储起来,其存储了相当多的数据,对于某个特定的散列值,在数据库中查找其对应的原字符串即可,也就是穷举法。尽管这需要很大的数据量,但由于很多密码具有一定的相似性,比如生日、电话等等,所以很多使用MD5算法加密的密文可以被破解。

http://www.cmd5.com/default.aspx
一个可以破解MD5的网站:http://www.cmd5.com/default.aspx

初始化

  1. 将输入的字符串转为二进制表示,然后通过一系列特定方法将其位数拓展为512的倍数。
  2. 初始化四个缓冲器A,B,C,D的内容,这四个缓冲器都可以理解为32位的寄存器。
  3. 将1中填充过后的信息以每512位作为一块,每块作为算法中一次循环的输入

算法步骤


一块MD5算法的执行由一个64次的循环完成,分为4组,每组16次,图中每个方框为1组,每个T[i]对应一次。

  1. 字符串填充,得到长度为512倍数的二进制串,也就是图中的message
    填充步骤:
    1. 在输入的串后面添加一个’1’
    2. 在1中得到的串后面一直添加‘0’,直到串的长度为512*n - 64,其中n为整数
    3. 求出1中输入的串的长度,将其存入一个64位的寄存器中,然后将该寄存器中的内容以小端(Little-Endian)方式存放在2中得到的串的后面。

填充完成后,将每块(512位)分为16组,每组32位,存在一个长度为16的int数组message中。

举例:如果我的输入转化了一个长度为128的位串,那么我在它后面添加1个’1’和319个’0’,此时位串的长度为448。然后原输入位串的长度是128,表示为16进制是00 00 A0 00,将它以小端方式添加到串的后面,也就是在串的后面添加00 A0 00 00,得到初始化后的位串。

至此,我们得到了一个长度为512倍数的位串。

  1. 初始化缓冲器
    初始化方法:我们的目标是在128位的缓冲器中存入如下数据:
    0x01234567 89ABCDEF FEDCBA98 76543210
    因为我们的数据在内存中是按小端方式存放的,所以应将A初始化为0x67452301,B初始化为0xEFCDAB89(long),C初始化为0x98BADCFE(long),D初始化为0x10325476(long)。

  2. 初始化T数组
    T数组是一个长度为64的int数组,其目的是为了生成一些分布比较均匀的数,在实现时使用到了正弦函数。伪代码如下:
    for i from 0 to 63
    T[i] := floor(abs(sin(i + 1)) × 2^32)

  3. 执行函数
    规则:在图中每个方框中执行它们对应的四个函数F,G,H,I,它们的输入都是B,C,D,定义如下:
    F ( B , C , D ) = ( B ∧ C ) ∨ ( ¬ B ∧ D ) F(B,C,D) = (B \wedge C) \vee (\neg B \wedge D) F(B,C,D)=(BC)(¬BD)
    G ( B , C , D ) = ( B ∧ D ) ∨ ( C ∧ ¬ D ) G(B,C,D) = (B \wedge D) \vee ( C \wedge \neg D) G(B,C,D)=(BD)(C¬D)
    H (

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值