您可能误解了MD5算法。转载本文请联系精益码农公众号。“MD5加密”纯属口头禅。MD5不是加密算法,而是摘要算法。今天小马就带大家梳理一下加密算法和摘要算法的定义和使用场景:伸手先看答案:加密算法的目的是防止别人成功查看加密数据,需要的时候再解密数据查看数据。MD5算法是一种哈希算法。哈希算法本身的设计目的决定了它在大多数情况下是不可逆的,即你通过哈希算法得到的数据是任何算法都无法还原的。因此,既然数据无法还原,就不能称为解密;既然无法解密,散列的过程就不能称为【加密】。EncryptionAlgorithm加密:使用特殊的算法改变原始信息,使未经授权的用户即使获得了加密后的信息,但由于不知道解密方法,仍然无法理解信息的内容。解密:加密的逆过程就是解密,也就是将加密信息转换成其原始信息的过程。加密算法分为对称加密和非对称加密。对称加密算法的加密和解密密钥相同,非对称加密和解密的密钥不同。HTTPS同时使用非对称加密和对称加密。在连接建立阶段,使用非对称加密和解密(保护密钥不被查看),在通信阶段,使用对称密钥加密和解密数据。摘要算法摘要算法,又称散列算法、散列算法。通过一个函数,将任意长度的内容转换成定长的数据串。摘要算法之所以能够指出数据是否被篡改,是因为摘要函数是一种单向函数,计算容易,但通过摘要推导出数据非常困难。此外,修改一点原始数据将导致计算出的摘要完全不同。使用迅雷下载某部电影时,下载站点会顺便给你一个MD5验证码;你找一个MD5校验工具,对下载的文件执行MD5算法,将得到的哈希值与下载网站附带的MD5值进行比较,如果值相同,则不是从该网站下载的文件损坏。HMAC扩展说一下结合了key和hash函数的请求认证方案:HMAC(hash-basedmessageauthenticatedcode)很多第三方平台都使用这种授权认证方案。如果你还记得,api平台是否经常给你一个ForAppIDSerectKey1。客户端和服务器都知道一个私钥serectkey2。客户端每次请求都会生成一个hash值,为(请求数据+秘钥)HMAC=hashFunc(秘钥+消息)3。客户端将hash值作为请求的一部分一起发送4.服务器收到请求后,生成一个hashfor(receivedrequest+foundSerectkey'),并将计算出的hash值与附在请求上的原始hash进行比较request比较希腊值,如果相同,则确定请求来自可信Client,请求未被篡改。为什么会有这样的效果呢?第一:Client和Server的hash值相同。根据哈希算法的设计初衷,表明请求过程没有被篡改;另一方面也推导出Client和Server使用相同的SerectKey,SerectKey是私有信息,所以这里Client发送的请求是不能被拒绝的。也可以考虑在客户端生成hash的时候加上timestamp时间戳(请求也应该附带这个时间戳)。服务器收到后,首先将服务器时间戳与请求时间戳进行比较,限定为15s以内的有效请求。为(requestmessage+serectkey+timestamp)生成哈希并比较哈希以避免重放攻击。总结一下本文给出的例子:HTTPS、迅雷MD5验证,足以帮助你理解加密算法和摘要算法的设计目的。?加密算法的目的是为了防止信息被偷看?抽象算法的目的是防止信息被篡改,可以有的放矢地使用,面试时不会出现笑话。文末给出的WebAPI授权方案HMAC是结合key+hash算法的应用场景,具有快速、自签名的特点。
