关于验签与加密

  前阵子,看了一篇关于MD5博客,该博客的博主表达的观点大概是这样的:MD5是一种消息摘要算法,初衷是验证信息是否被篡改过,并不是主要用于加密。正巧最近也遇到了关于接口验签算法是否有必要更改的问题,顺道记下自己的想法。

  关于MD5

  MD5算法,对于做技术的人,应该是耳熟能详的算法了。MD,其实只是消息摘要。细数我们生活中常见会用到它的几个场景,大概可以分为两种,一种是对信息进行不可逆的加密,如我们常用的,对密码进行加密,想从加密后的字符串再得到加密前的算法,基本上很难;第二种是对信息进行校验,这种最常见的是一些开源的软件和框架,在下载的时候,大都会附上MD5字符串和SHA-1字符串,为了让人们下载后,验证该文件是否在传播过程中被人修改过或者加入什么恶意的东西。

  表达一下自己的看法,我就觉得之前看的那篇博客的博主是对的。

  关于加密,当谈到这个的时候,我们是时常会和解密联系在一起。因为我们之所以要加密,是为了防止信息被盗取,同时,当我们获取到加密信息的时候,是要获取到其中的内容的,而不是只进行加密而不进行解密。MD5用于加密的场景非常的简单,就是对用户的密码进行加密,防止明文传输。当传递到服务器的时候,服务器压根不需要对其信息进行获取,只需要保证其内容不可泄露即可。在这种场景下,MD5加密时候存在价值的。可是,当用于可用信息的加密传输,这种MD5加密的价值基本为零。对此可以总结出,MD5 加密的可用场景:对不可泄露且不需得到解密后数据的信息进行加密。

  回头看看MD5主要作用,信息摘要,其实该算法保证了,不同的内容不能得到相同的摘要值,这样,哪怕只要是对内容进行的一丝的修改,获取到的摘要值都是不一样的,这样就可以保证信息的完整性。这样子可以决定了该算法的主要场景,用于公开信息(非敏感信息)的完整性校验。

  这种场景多么?其实在真实情况中,还是比较多的,比方说之前提到的,开源软件的MD5校验值。还有比较常见的比如接口的开发。企业的接口开发,特别是对外公开的接口,如果不进行信息的校验,可能会带来非常严重的后果。可是因为接口是对外公开的,如果进行了加密,必然存在解密的必要。那么就存在这样的问题,如果我要求对方传来的信息是加密的,就必须算法协商好加密解密的算法。这样子,那么因为接口是公开的,加密的算法也必须公开,因此如果不是采用不对称加密的话,这样子,相当于掩耳盗铃,并不能起到很大的作用。但是如果进行不对称加密的话,因为接口是公开的,如果调用的人多了,着意味着要产生大量的公钥和私钥,这样对于一些要求不是很高的接口,显然也不可行。因此就有了采用MD5 进行验签的方式了。正如腾讯微信接口,就是采用这样的方式,微信的大部分post接口都要求进行MD5加密,大概的加密时候这样的,首先对需要传递的信息进行一次字段的排序,然后对&进行字段的拼接拼接完成之后获取MD5摘要值,传递的时候,需要将MD5摘要值也传上。有人会说,如果这样子的话,那么截取到传递的值,改一下,在进行MD5取摘要值,在传递给服务器不就可以了么。是这样子的,可是腾讯微信的接口有个不进行传递的字符串。腾讯微信给每个用户分配了一个appid和一个加密串,在进行加密的时候,通常需要将两者都进行字符串的拼接再加密,而在传递的过程中,一般只传递appid,只要获取不到加密串,就无法得到正确的MD5值,而加密串因为只有双方知道,所以就不存在不可解的问题。这样的做法,有点类似于私钥加密,但准确的来说,这是私钥验签才对。

  由此可见,如果对非敏感信息进行验签的话,其实,验签的算法取决于业务逻辑,而不再与采用哪种算法。

你可能感兴趣的:(关于验签与加密)