版权归其所有论文作者所有。

并没写原始的地址,因为这是我整合的,作者太多,包括我。太匆忙,原作者可以联系我。

简介

MD5适用于数据完整性校验的。将任意长度的字节串(所以是基于底层的二进制串的),映射成为一个128位的大整数2^128种可能性。同样的内容经过md5,会得到同样的128位码。本质上是散列算法,有损的信息压缩,并且是不可逆的。

MD5广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不“知道”用户的密码是什么。

一个安全的散列算法具有如下特点:

(1)仅从散列值无法反推出原信息;

(2)两个不同数字信息产生同样的散列值的概率是非常小的,几乎为零;

(3)原信息的微小改变(哪怕只改变一位),将导致散列值的很大变化。

线性同余随机数服从均匀分布

2 实现步骤

2.1 填充

在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余数的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后再在这个结果后面附加一个以64位二进制表示的填充前的信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍数。这样做的原因是为满足后面处理中对信息长度的要求。

2.2 设置链接变量

MD5中有四个32位被称作链接变量(ChainingVariable)的整数参数,他们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。当设置好这四个链接变量后,就开始进入算法的四轮循环运算,循环的次数是信息中512位信息分组的数目。

2.3 进行主循环

接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。

将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。

主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。

2.3.1 以一下是每次操作中用到的四个非线性函数(每轮一个)。

F(X,Y,Z)=(X&Y)|((~X)&Z)

G(X,Y,Z)=(X&Z)|(Y&(~Z))

H(X,Y,Z)=X^Y^Z

I(X,Y,Z)=Y^(X|(~Z))

(&是与,|是或,~是非,^是异或)

这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。

函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。

设Mj表示消息的第j个子分组(从0到15),<<< s表示循环左移s位,则四种操作为:

FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<<s)

GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<<s)

HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<<s)

II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<<s)

这四轮(64步)具体表示请看附录。

2.3.2 常数ti可以如下选择:

在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。

(2的32次方)

所有这些完成之后,将A,B,C,D分别加上a,b,c,d。然后用下一分组数据继续运行算法,最后的输出是A,B,C和D的级联。

3 MD5的安全性

虽然应该先吹一波MD5如何安全,如何均匀,但是,MD5是不安全的。

对于两个不同数字信息产生同样的散列值的概率是非常小的,几乎为零,需要明确的是,散列算法是一个将无穷维空间的信息映射到有限维空间的变换,不是一个一一映射。实际上一个散列值可能对应有无穷多个数字信息,换言之,会有无穷多个数字信息产生同样一个散列值。产生相同散列值的两个不同的消息被称为碰撞(Collision),所以,散列函数存在碰撞是必然的。我们定义一个“安全”的散列算法,主要是指在以下三种意义上是“计算安全”的:

其一://Preimage Attack(原像攻击)

给定明文M1,找到另一明文M2(不等于M1),使得hash(M1)=hash(M2);

其二: //Second Preimage Attack(二次原像攻击)

给定明文M1,找到另一明文M2(不等于M1),使得hash(M1)=hash(M2);

其三://CollisionAttack(碰撞攻击)

找到两个不同的M1和M2,使得hash(M1)=hash(M2)。

对于原像攻击(Preimage Attack),实际应用中最常见的是采用“字典法”,将明文和密文对存储起来,使用时只需查询出来即可。这种方法看似技术含量不高,事实上确实最具威胁性。目前互联网上已经有近百个此类查询站点了。

对于次原像攻击(Second Preimage Attack),目前密码学界尚未有突破性进展,可以认为是MD5算法是“计算安全”的。

MD5的输出为128位,若采用纯强力攻击寻找一个消息具有给定Hash值的计算困难性为2128,用每秒可试验1000000000个消息的计算机需时1.07×1022年。若采用生日攻击法,寻找有相同Hash值的两个消息需要试验264个消息,用每秒可试验1000000000个消息的计算机需时585年。

不过事实上,2004年,王小云教授证明MD5数字签名算法可以产生碰撞,2009年,冯登国、谢涛二人利用差分攻击,将MD5的碰撞算法复杂度从王小云的2^42进一步降低到2^21,极端情况下甚至可以降低至2^10。仅仅2^21的复杂度意味着即便是在2008年的计算机上,也只要几秒便可以找到一对碰撞。

4 MD5加盐

还有一种增加安全性的手段是,MD5加盐,就是在Md5码上加上别的字符串(盐),所以即使有暴力破解的手段,不知道盐,依旧不能得到真正的Md5码。

通过密码加盐,密码的安全性已经提高了不少。但是还可以进一步改进。

假设字符串拼接算法、盐值已外泄,上面的代码至少存在下面问题:

短盐值:需要穷举的可能性较少,容易暴力破解,一般采用长盐值来解决。

盐值固定:类似的,攻击者只需要把常用密码+盐值的hash值表算出来,就完事大吉了。

短盐值自不必说,应该避免。对于为什么不应该使用固定盐值,这里需要多解释一下。很多时候,我们的盐值是硬编码到我们的代码里的(比如配置文件),一旦坏人通过某种手段获知了盐值,那么,只需要针对这串固定的盐值进行暴力穷举就行了。

4.1 随机盐值。

密码一样,由于采用了随机盐值,前后运算得出的结果是不同的。这样带来的好处是,多个用户,同样的密码,攻击者需要进行多次运算才能够完全破解。同样是纯数字3位短盐值,随机盐值破解所需的运算量,是固定盐值的1000倍。

5 MD6

MD5被攻破后,在Crypto2008上, Rivest提出了MD6算法,该算法的Blocksize为512 bytes(MD5的Block Size是512 bits), Chaining value长度为1024 bits, 算法增加了并行 机制,适合于多核CPU。 在安全性上,Rivest宣称该算法能够抵抗截至目前已知的所有的 攻击(包括差分攻击)。

附录:

第一轮

FF(a,b,c,d,M0,7,0xd76aa478)

FF(d,a,b,c,M1,12,0xe8c7b756)

FF(c,d,a,b,M2,17,0x242070db)

FF(b,c,d,a,M3,22,0xc1bdceee)

FF(a,b,c,d,M4,7,0xf57c0faf)

FF(d,a,b,c,M5,12,0x4787c62a)

FF(c,d,a,b,M6,17,0xa8304613)

FF(b,c,d,a,M7,22,0xfd469501)

FF(a,b,c,d,M8,7,0x698098d8)

FF(d,a,b,c,M9,12,0x8b44f7af)

FF(c,d,a,b,M10,17,0xffff5bb1)

FF(b,c,d,a,M11,22,0x895cd7be)

FF(a,b,c,d,M12,7,0x6b901122)

FF(d,a,b,c,M13,12,0xfd987193)

FF(c,d,a,b,M14,17,0xa679438e)

FF(b,c,d,a,M15,22,0x49b40821)

第二轮

GG(a,b,c,d,M1,5,0xf61e2562)

GG(d,a,b,c,M6,9,0xc040b340)

GG(c,d,a,b,M11,14,0x265e5a51)

GG(b,c,d,a,M0,20,0xe9b6c7aa)

GG(a,b,c,d,M5,5,0xd62f105d)

GG(d,a,b,c,M10,9,0×02441453)

GG(c,d,a,b,M15,14,0xd8a1e681)

GG(b,c,d,a,M4,20,0xe7d3fbc8)

GG(a,b,c,d,M9,5,0x21e1cde6)

GG(d,a,b,c,M14,9,0xc33707d6)

GG(c,d,a,b,M3,14,0xf4d50d87)

GG(b,c,d,a,M8,20,0x455a14ed)

GG(a,b,c,d,M13,5,0xa9e3e905)

GG(d,a,b,c,M2,9,0xfcefa3f8)

GG(c,d,a,b,M7,14,0x676f02d9)

GG(b,c,d,a,M12,20,0x8d2a4c8a)

第三轮

HH(a,b,c,d,M5,4,0xfffa3942)

HH(d,a,b,c,M8,11,0x8771f681)

HH(c,d,a,b,M11,16,0x6d9d6122)

HH(b,c,d,a,M14,23,0xfde5380c)

HH(a,b,c,d,M1,4,0xa4beea44)

HH(d,a,b,c,M4,11,0x4bdecfa9)

HH(c,d,a,b,M7,16,0xf6bb4b60)

HH(b,c,d,a,M10,23,0xbebfbc70)

HH(a,b,c,d,M13,4,0x289b7ec6)

HH(d,a,b,c,M0,11,0xeaa127fa)

HH(c,d,a,b,M3,16,0xd4ef3085)

HH(b,c,d,a,M6,23,0x04881d05)

HH(a,b,c,d,M9,4,0xd9d4d039)

HH(d,a,b,c,M12,11,0xe6db99e5)

HH(c,d,a,b,M15,16,0x1fa27cf8)

HH(b,c,d,a,M2,23,0xc4ac5665)

第四轮

II(a,b,c,d,M0,6,0xf4292244)

II(d,a,b,c,M7,10,0x432aff97)

II(c,d,a,b,M14,15,0xab9423a7)

II(b,c,d,a,M5,21,0xfc93a039)

II(a,b,c,d,M12,6,0x655b59c3)

II(d,a,b,c,M3,10,0x8f0ccc92)

II(c,d,a,b,M10,15,0xffeff47d)

II(b,c,d,a,M1,21,0x85845dd1)

II(a,b,c,d,M8,6,0x6fa87e4f)

II(d,a,b,c,M15,10,0xfe2ce6e0)

II(c,d,a,b,M6,15,0xa3014314)

II(b,c,d,a,M13,21,0x4e0811a1)

II(a,b,c,d,M4,6,0xf7537e82)

II(d,a,b,c,M11,10,0xbd3af235)

II(c,d,a,b,M2,15,0x2ad7d2bb)

II(b,c,d,a,M9,21,0xeb86d391)

MD5流程以及安全性分析,MD5加盐,MD6,笔记相关推荐

  1. C++实现MD5摘要算法加盐salt值

    C++实现MD5摘要算法加盐salt值 1.信息摘要函数 1.1Hash函数 哈希函数就是能将任意长度的数据映射为固定长度的数据的函数.哈希函数返回的值被叫做哈希值.哈希码.散列,或者直接叫做哈希. ...

  2. Java使用MD5加盐对密码进行加密处理,附注册和登录加密解密处理

    前言 在开发的时候,有一些敏感信息是不能直接通过明白直接保存到数据库的.最经典的就是密码了.如果直接把密码以明文的形式入库,不仅会泄露用户的隐私,对系统也是极其的不厉,这样做是非常危险的. 那么我们就 ...

  3. 密码加盐原理及其实现

    目录 1. 背景介绍 2. MD5加密算法 2.1 MD5算法的介绍 2.2 MD5算法的缺点 3. 加盐算法 3.1 什么是加盐算法 3.2 加盐算法的演示 4. 总结 1. 背景介绍 加密密码是现 ...

  4. 对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密

    RSA和AES结合使用 接上篇的RSA和AES算法加密之后,AES对称算法对数据量大的加密比较快,而RSA公私钥加密的话会影响加密效率,但是AES的加密与解密的密钥是一致的,导致密钥不能外泄,密钥在网 ...

  5. SpringBoot 系列教程(八十五):Spring Boot使用MD5加盐验签Api接口之前后端分离架构设计

    加密算法参考: 浅谈常见的七种加密算法及实现 加密算法参考: 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用 目的: 通过对API接口请求报文签名,后端进行验签处理, ...

  6. 【项目】MD5加盐源码理解

    1.shiro中主要的类 简单看一下即可,shiro是一个安全验证框架,相对Spring security使用更为简单.本篇文章使用的的md5加密和加盐是基于shiro框架. 复制代码 主要功能:认证 ...

  7. 浅谈MD5加密算法中的加盐值(SALT)

    我们知道,如果直接对密码进行散列,那么***可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法, ...

  8. MD5工具类(含16位、32位、加盐、无盐、大小写)

    什么是MD5 MD5(Message-Digest Algorithm 5),即消息摘要算法第五版,是一种被广泛使用的密码散列函数.散列算法的基础原理是:将数据(如一段文字)运算演变为另一段固定长度( ...

  9. 一文读懂md5,md5有什么用,什么是md5加盐

    md5是一种密码散列函数,在计算机安全领域得到广泛的应用.本文将带大家了解一些md5的知识点,什么是md5,md5有什么用,什么是md5加盐,为什么md5不可逆,为什么md5可能会被解密?帮助大家快速 ...

最新文章

  1. 探秘Hadoop生态12:分布式日志收集系统Flume
  2. mybatis框架中的mapper.xml文件中的头部代码
  3. P3466-[POI2008]KLO-Building blocks【Treap】
  4. 小杜机器人线下店_阿里线下卖车已成事实,阿里造车还会远吗?
  5. C++语言类的详解和示例
  6. Axure智慧、智能乡镇通数字管理服务平台+基础数据管理+招商后台管理+web端高保真管理后台
  7. python 入门基础-零基础入门Python,看这一篇就够了!
  8. 升讯威自来水公司电子开票系统(金税系统对接开发小记)
  9. 三角形度数计算机公式,三角形角度计算公式
  10. hdu5855二分+最大流
  11. 渣本毕业两年经验,大厂内部资料
  12. R语言入门——不掉包实现FNN(单层感知机)
  13. EVE-ng模拟器安装教程和使用教程
  14. 一台服务器可以架设几个不同的版本?一台服务器可以架设几个微端?
  15. c++ 反射_实现光时域反射仪中的应用原理基于飞凌FETA40i-C核心板
  16. 简述驱动桥的动力传递路线_驱动桥
  17. 技能篇:开发必备linux命令大全-稳赚不亏
  18. VS2017、opencv安装
  19. 如何在Android Studio使用单选和复选框
  20. Python-模板注入

热门文章

  1. ABAP-ALV-双击界面弹出窗口 (SALV)
  2. Checked异常和Unchecked异常
  3. c语言的jmp_buf函数
  4. 新概念英语学习三Unit3
  5. 诗歌五 增广贤文(古人不见今时月,今月曾经照古人)
  6. 异步爬虫爬取实战-asyncio
  7. 全国高校学科评估:各专业排名前十的高校
  8. win10计算机同步在哪个文件夹,公文包和文件夹的区别在哪?Win10公文包怎样同步?...
  9. 独步山南之乌龟岭迷路
  10. c语言算法:排队打饭