你怕是对MD5算法有误解

简介: "MD5加密"纯属口嗨,MD5不是加密算法,是摘要算法。

今天小码甲带大家梳理加密算法、摘要算法的定义和场景:


755922e841d6ed557f7214fd8c71ee4a.png


伸手党先看答案:


加密算法的目的,在于使别人无法成功查看加密的数据,并且在需要的时候还可以对数据进行解密来重新查看数据。


而MD5算法是一种哈希算法,哈希算法的设计目的本身就决定了,它在大多数情况下都是不可逆的,即你通过哈希算法得到的数据,无法经过任何算法还原回去。所以既然不能将数据还原,也就不能称之为解密;既然不能解密,那么哈希的过程自然也就不能称作是[加密]了。


加密算法


加密:是以某种特殊的算法改变原有的信息,使得未授权的用户即使获得已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。


解密:加密的逆过程为解密,即将该加密信息转化为其原来信息的过程。


加密算法分为对称加密和非对称加密,其中对称加密算法的加解密密钥相同,非对称加解密的密钥不同。


8044e37de945d201af43b9151c73ef08.png


HTTPS就同时用到非对称加密和对称加密,在连接建立阶段,使用非对称加解密(保护密钥不被查看), 在通信阶段使用对称密钥加解密数据。


d4f7ae6b6fbe7ee7e2205dcdb0ce5d3d.png


摘要算法


摘要算法,又称哈希算法、散列算法。通过一个函数,将任意长度的内容转换为一个固定长度的数据串。


280138bb9021cef64d306e8194de6fa6.png


摘要算法之所以能指出数据是否被篡改,就是因为摘要函数是一个单向函数,计算很容易,但通过摘要(digest) 反推data却非常困难,而且,对于原始数据做一个bit的修改,都会导致计算出的摘要完全不同。


使用迅雷下载某片的时候,下载站会顺带给你一个MD5校验码;


你找一个MD5校验工具,对下载下来的文件执行MD5算法,将得到的哈希值与下载站附带的MD5值对比,如果值是相同的,说明从该网站下载的文件没有损坏。


HMAC


延伸聊一个结合了密钥和哈希功能的请求认证方案:


HMAC ( hash-based message authenticated code)


很多第三方平台都采用这种授权认证方案,你回想一下,api平台是不是经常给你一对AppIDSerect Key


1.Client & Server 都知晓一个私钥serect key


2.客户端每次请求时,会针对(请求数据+ secret key)生成一个hash值

HMAC = hashFunc(secret key + message)


3.客户端将哈希值做为请求的一部分,一起发送


4.当服务端收到请求, 对( 收到的请求+ 查到的Serectkey')生成哈希,将计算的哈希值与请求中附带的原哈希值对比,如果相同,则认定请求来自受信Client,且请求未被篡改。


为什么会有这样的效果?


首先:Client 和Server的哈希值相同,根据哈希算法的设计初衷,说明请求过程未被篡改;


另一方面也反推 Client 和Server使用的是同一个Serect Key , 而Serect Key是私密信息,故此处的Client发送请求不可抵赖。


还可以考虑在客户端生成哈希时加入timestamp时间戳(请求也要附带这个时间戳),服务端收到后,先对比服务器时间戳与请求时间戳,限制15s内为有效请求,服务端再对(请求消息+ serect key+ timestamp)生成哈希,对比哈希,避免重放攻击


总结


本文给出的示例:HTTPS、迅雷MD5校验,足够帮助你了解加密算法和摘要算法的设计目的。


加密算法的目的是:防止信息被偷看


摘要算法的目的是:防止信息被篡改


以后使用时候也能有的放矢,面试时也不会闹出笑话。


最后给出的WebAPI授权方案HMAC,算是密钥+哈希算法结合的一个应用场景, 具备快速、自签名的特点。

相关文章
|
2月前
|
算法 数据安全/隐私保护
火山中文编程 -- MD5算法和SHA算法
火山中文编程 -- MD5算法和SHA算法
19 0
火山中文编程 -- MD5算法和SHA算法
|
2月前
|
算法 Java Android开发
安卓逆向 -- NDK开发实现MD5算法
安卓逆向 -- NDK开发实现MD5算法
34 0
|
2月前
|
算法 JavaScript Java
安卓逆向 -- 算法基础(MD5)
安卓逆向 -- 算法基础(MD5)
13 0
|
2月前
|
算法 Android开发
安卓逆向 -- 自吐算法(MD5和SHA)
安卓逆向 -- 自吐算法(MD5和SHA)
14 0
|
4月前
|
算法 安全 Java
MD5 - 加密算法简要介绍与JAVA实现
MD5 - 加密算法简要介绍与JAVA实现
53 1
|
9月前
|
存储 算法 安全
【算法】Java实现MD5算法
MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,用于计算消息的摘要或校验和。MD5算法将任意长度的消息作为输入,并输出一个固定长度(128位)的摘要,通常表示为32个十六进制字符。
110 0
|
6月前
|
数据采集 JavaScript 前端开发
“探秘JS加密算法:MD5、Base64、DES/AES、RSA你都知道吗?”
“探秘JS加密算法:MD5、Base64、DES/AES、RSA你都知道吗?”
109 0
|
7月前
|
算法 C# 流计算
MD5、SHA256等Hash算法的实时计算
MD5、SHA256等Hash算法的实时计算
|
8月前
|
存储 算法 数据库
MD5工具类(信息摘要算法)
MD5工具类(信息摘要算法)
78 0
|
9月前
|
人工智能 算法 安全
网络安全实验七 Hash算法MD5分析
网络安全实验七 Hash算法MD5分析
142 0