漫画:什么是MD5算法

转载自 玻璃猫 程序员小灰

 

摘要哈希生成的正确姿势是什么样呢?分三步:

1.收集相关业务参数,在这里是金额和目标账户。当然,实际应用中的参数肯定比这多得多,这里只是做了简化。

2.按照规则,把参数名和参数值拼接成一个字符串,同时把给定的密钥也拼接起来。之所以需要密钥,是因为攻击者也可能获知拼接规则。

3.利用MD5算法,从原文生成哈希值。MD5生成的哈希值是128位的二进制数,也就是32位的十六进制数。

第三方支付平台如何验证请求的签名?同样分三步:

1.发送方和请求方约定相同的字符串拼接规则,约定相同的密钥。

2.第三方平台接到支付请求,按规则拼接业务参数和密钥,利用MD5算法生成Sign。

3.用第三方平台自己生成的Sign和请求发送过来的Sign做对比,如果两个Sign值一模一样,则签名无误,如果两个Sign值不同,则信息做了篡改。这个过程叫做验签

MD5算法底层原理:

简单概括起来,MD5算法的过程分为四步:处理原文设置初始值循环加工,拼接结果

第一步:处理原文

首先,我们计算出原文长度(bit)对512求余的结果,如果不等于448,就需要填充原文使得原文对512求余的结果等于448。填充的方法是第一位填充1,其余位填充0。填充完后,信息的长度就是512*N+448。

之后,用剩余的位置(512-448=64位)记录原文的真正长度,把长度的二进制值补在最后。这样处理后的信息长度就是512*(N+1)。

第二步:设置初始值

MD5的哈希结果长度为128位,按每32位分成一组共4组。这4组结果是由4个初始值A、B、C、D经过不断演变得到。MD5的官方实现中,A、B、C、D的初始值如下(16进制):

A=0x01234567

B=0x89ABCDEF

C=0xFEDCBA98

D=0x76543210

第三步:循环加工

这一步是最复杂的一步,我们看看下面这张图,此图代表了单次A,B,C,D值演变的流程。

图中,A,B,C,D就是哈希值的四个分组。每一次循环都会让旧的ABCD产生新的ABCD。一共进行多少次循环呢?由处理后的原文长度决定。

假设处理后的原文长度是M

主循环次数 = M / 512

每个主循环中包含 512 / 32 * 4 = 64次 子循环。

上面这张图所表达的就是单次子循环的流程。

下面对图中其他元素一一解释:

1.绿色F

图中的绿色F,代表非线性函数。官方MD5所用到的函数有四种:

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))

在主循环下面64次子循环中,F、G、H、I 交替使用,第一个16次使用F,第二个16次使用G,第三个16次使用H,第四个16次使用I。

2.红色“田”字

很简单,红色的田字代表相加的意思。

3.Mi

Mi是第一步处理后的原文。在第一步中,处理后原文的长度是512的整数倍。把原文的每512位再分成16等份,命名为M0~M15,每一等份长度32。在64次子循环中,每16次循环,都会交替用到M1~M16之一。

4.Ki

一个常量,在64次子循环中,每一次用到的常量都是不同的。

5.黄色的<<<S

左移S位,S的值也是常量。

“流水线”的最后,让计算的结果和B相加,取代原先的B。新ABCD的产生可以归纳为:

新A = 原d

新B = b+((a+F(b,c,d)+Mj+Ki)<<<s)

新C = 原b

新D = 原c

总结一下主循环中的64次子循环,可以归纳为下面的四部分:

第一轮:

FF(a,b,c,d,M0,7,0xd76aa478) s[0]=7, K[0] = 0xd76aa478

FF(a,b,c,d,M1,12,0xe8c7b756)s[1]=12, K[1] = 0xe8c7b756

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

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

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

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

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

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

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

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

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

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

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

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

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

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

第二轮:

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

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

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

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

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

GG(a,b,c,d,M10,9,0x02441453)

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

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

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

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

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

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

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

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

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

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

第三轮:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

第四轮:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

第四步:拼接结果

这一步就很简单了,把循环加工最终产生的A,B,C,D四个值拼接在一起,转换成字符串即可。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea快速生成crud_Java / Spring:如何快速生成完整的Swagger文档CRUD REST API

idea快速生成crud作为开发人员&#xff0c;我们在日常生活中经常面临的最繁琐的任务之一就是编写良好且易于理解的文档。 无论我们的文档只有几行来解释功能的核心功能&#xff0c;还是表明系统的来龙去脉的成熟文章都没关系。 重要的是&#xff0c;我们试图通过文档传达的信息…

漫画:如何破解MD5算法

转载自 玻璃猫 程序员小灰 在之前的漫画中&#xff0c;我们介绍了MD5算法的基本概念和底层原理&#xff0c;没看过的小伙伴们可以点击下面的链接&#xff1a;《漫画&#xff1a;什么是MD5算法&#xff1f;》 这一次&#xff0c;我们来讲解如何破解MD5算法。 设MD5的哈希函数是…

自定义类加载器(ClassLoader + URLClassLoader)

【0】README 0.1&#xff09;本文主要对类加载器进行分析&#xff0c;且 URLClassLoader是 ClassLoader的子类&#xff1b; 0.2&#xff09;关于如何设置类加载器的加载路径&#xff0c;参见 对servlet容器的补充 【1】URLClassLoader类加载器 1.1&#xff09;URLClassLoad…

fork/join和线程池_从fork-join /线程池调用的Singelton bean中的访问spring请求范围缓存...

fork/join和线程池问题&#xff1a; 启用了Spring且其范围设置为Request的缓存需要由不在请求范围内的singleton bean访问。 解&#xff1a; Spring使您能够创建缓存&#xff0c;该缓存为请求范围保留数据。 例如 import org.springframework.cache.concurrent.ConcurrentMapC…

tomcat(2)一个简单的servlet容器

【0】README 0.1&#xff09;本文部分文字转自 “深入剖析Tomcat”&#xff0c;旨在学习 一个简单的servlet容器 的基础知识&#xff1b; 0.2&#xff09;for complete source code, please visit https://github.com/pacosonTang/HowTomcatWorks/tree/master/chapter2 0…

漫画:什么是Base64算法

转载自 玻璃猫 程序员小灰 ValueChar ValueChar ValueChar ValueChar0A16Q32g48w1B17R33h49x2C18S34i50y3D19T35j51z4E20U36k5205F21V37l5316G22W38m5427H23X39n5538I24Y40o5649J25Z41p57510K26a42q58611L27b43r59712M28c44s60813N29d45t61914O30e46u6215P31f47v63/控制字符&am…

soapui 测试soap_使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第一部分

soapui 测试soap在这个分为三部分的系列中&#xff0c;我将演示如何使用SoapUI API工具来调用安全的WCF SOAP服务。 第一篇文章将着重于创建将要测试的系统的服务。 第二篇文章将介绍在基本身份验证机制保护的情况下调用它所需的步骤。 在最后一部分中&#xff0c;我将对初始服…

dmn是大脑中哪个区域_DMN中的函数式编程:感觉就像再次重读我的大学课程一样...

dmn是大脑中哪个区域在本文中&#xff0c;我想分享有关DMN中递归支持的有趣见解&#xff0c;并重点介绍FEEL语言的特定属性如何使功能性编程结构能够在DMN中建模。 我们将从一个基本示例开始&#xff0c;以演示FEEL语言和DMN构造的“商业友好”性质如何使我们能够解决一个通常…

对Servlet容器的补充

【0】README 0.1&#xff09;本文是对 一个简单的servlet容器 的补充&#xff1b; 【1】Servlet容器 1.1&#xff09;通过一个简单的servlet容器这篇博文&#xff0c;我们看到&#xff1a;其中的核心代码是 类加载器&#xff0c; 然而&#xff0c;在我follow 其代码&#xf…

漫画:什么是A*寻路算法

转载自 玻璃猫 程序员小灰比如像这样子&#xff1a;第一步&#xff1a;把起点放入OpenList第二步&#xff1a;找出OpenList中F值最小的方格&#xff0c;即唯一的方格Node(1,2)作为当前方格&#xff0c;并把当前格移出OpenList&#xff0c;放入CloseList。代表这个格子已到达并…

apache ignite_Kubernetes集群上的Apache Ignite和Spring第2部分:Kubernetes部署

apache ignite以前&#xff0c;我们已经成功创建了第一个由Apache Ignite支持的Spring boot Application。 在此博客上&#xff0c;我们将重点介绍Kubernetes方面需要做的事情&#xff0c;以便能够启动我们的应用程序。 如先前博客所述&#xff0c;我们需要制定我们的Kuberne…

漫画:什么是布隆算法

转载自 玻璃猫 程序员小灰两周之前——爬虫的原理就不细说了&#xff0c;无非是通过种子URL来顺藤摸瓜&#xff0c;爬取出网站关联的所有的子网页&#xff0c;存入自己的网页库当中。但是&#xff0c;这其中涉及到一个小小的问题......URL去重方案第一版&#xff1a;HashSet 创…

2016第11届四川省高校计算机(软件)院长论坛纪要(旁听)

​【0】README 0.1&#xff09;该论坛与16年4月8日在西南交大召开&#xff0c;为贺西南交大120周年华诞&#xff1b; 0.2&#xff09;以下内容是小生在该论坛上的部分旁听内容&#xff08;仅仅是部分&#xff09;&#xff0c; 感觉很新鲜&#xff0c;故分享之&#xff1b; 0…

selenium自动化测试_为什么在生产中进行Selenium自动化测试对于您的下一个版本至关重要?...

selenium自动化测试您是否认为仅仅是因为您的Web应用程序在过渡环境中以飞快的速度通过&#xff0c;它对于生产环境也将是相同的&#xff1f; 您可能需要重新考虑&#xff01; 特别是&#xff0c;如果我们指的是跨浏览器测试 &#xff0c;则需要确保跨各种操作系统&#xff0c…

java.lang.ExceptionInInitializerError的原因

【0】README 0.1&#xff09;本文转自 http://blog.csdn.net/fykhlp/article/details/6236316&#xff1b; 【1】正文如下 这个错误是说变量初始化出现问题&#xff0c;通常出现在静态变量尤其是单例模式。这种问题往往是初始化顺序不对造成的&#xff0c;下面举个简单的例子。…

漫画:Bitmap算法 整合版

转载自 玻璃猫 程序员小灰两个月之前——为满足用户标签的统计需求&#xff0c;小灰利用Mysql设计了如下的表结构&#xff0c;每一个维度的标签都对应着Mysql表的一列&#xff1a;要想统计所有90后的程序员该怎么做呢&#xff1f;用一条求交集的SQL语句即可&#xff1a;Select…

tomcat(3)连接器

【0】README0.1&#xff09;本文部分内容转自“深入剖析tomcat”&#xff0c;旨在学习 tomcat(3)连接器 的基础知识&#xff1b;0.2&#xff09;Catalina 中有两个主要的模块&#xff1a;连接器&#xff08;ServerSocket&#xff09; 和 容器&#xff08;Servlet容器&#xff0…

java正则表达式验证_如何在Java中验证电话号码(正则表达式+ Google libphonenumber)...

java正则表达式验证关于如何在不同国家&#xff08;例如美国&#xff0c;美国&#xff09;使用Java验证电话号码的快速指南。 带有正则表达式和Google libphonenumber API的示例程序。 1.简介 在本教程中&#xff0c;我们将学习如何在java中验证电话号码 。 这主要是为了验证美…

漫画:什么是B-树

转载自 玻璃猫 程序员小灰 本文提到的「B-树」&#xff0c;就是「B树」&#xff0c;都是 B-tree 的翻译&#xff0c;里面不是减号-&#xff0c;是连接符-。因为有人把 B-tree 翻成 「B-树」&#xff0c;让人以为「B树」和「B-树」是两种树&#xff0c;实际上两者就是同一种树。…

tomcat(4)Tomcat的默认连接器

【0】README0.0&#xff09;本文部分文字描述转自&#xff1a;“深入剖析tomcat”&#xff0c;旨在学习 tomat(4)Tomat的默认连接器 的基础知识&#xff1b;0.1&#xff09;Tomcat中的连接器是一个独立的模块&#xff0c;可以插入到servlet容器中&#xff0c;而且还有很多连接器…