MD5算法是固定不变的吗?前端使用MD5对发送的数据签名有意义吗?

唐伯虎点蚊香
  • 389

看一些博客说前端发送的数据经过MD5生成哈希值,如果被坏人劫持更改了原始数据,那么哈希值就会改变,服务器把更改过的数据用MD5生成哈希值发现和前端传的哈希值不一样,就拒绝请求。

但是坏人即然能更改前端发送的原始数据,为啥不能把哈希值也替换掉呢,只要把篡改的数据也用MD5加密生成个新的哈希值也发给服务器,服务器不就不知道篡改过了吗?

我用js使用MD5加密的时候直接百度搜的一个MD5.js,也就是MD5算法是公开一样的?那么坏人使用同样的MD5算法加密篡改后的数据不就行了?

回复
阅读 3.4k
5 个回答
  1. 安全方面,任何措施都只能防住一部分入侵者,没法一劳永逸
  2. 但是这个 md5 hash 在我看来也太没用了……
  3. 如果对方能从你的数据中提取出想要的,还能修改成他希望的,那么伪造 hash 就是举手之劳
  4. 这个安全性远不如 https,我认为是不知其所以然的人拍脑门想出来的招数
  1. 算法确实是固定不变的;
  2. 中间人不一定知道你采用了 MD5 校验,这样可以防止一批攻击;
  3. 前后端可以约定一个 “盐值”,或者反复混淆数次,中间人没找到盐值或者混淆过程的话,也可以防止一批。

其实如果不是铁了心跟你卯下去的攻击者,大多数中间人是交给漏洞扫描脚本来试探接口的。脚本一般只会抓包改包,如果改了的包无效,它就放过了,因为进一步分析本地的加密过程需要人工介入,脚本仔们没那么多功夫给你抓虱子,他们甚至可能看不懂 JS

没用,如果只是防止中间人攻击, HTTPS 已经做得非常好了,并且远超你这个设计。

参考如下视频

如果是为了防止调试,也没有太大意义,因为你的密钥是要存储的,前端是需要得到这个密钥的,无论什么方式,别人都能拿到你的密钥。

微信支付的签名验证是纯后端服务器与微信服务器进行交换数据的,密钥也是在双方服务器存储的,并没有把密钥下发到客户端,场景完全不一样。

光是md5/sha之类的散列是不能确保数据不受篡改,要辅以非对称加密算法对散列值进行签名,就可以确保数据没有被篡改。

非对称加密算法如rsa,ecc等,有两个密钥,一个公钥一个私钥,用公钥加密数据之后只能用私钥才能解密,反过来也如此。

前端用rsa生成一个密钥对,自己留着私钥,把公钥公开,所有人都知道公钥,然后前端发送一个数据,用md5计算数据的散列值,然后再用私钥对散列值进行加密之后得到一个密文,称为签名,把数据和签名发给服务器,服务器用前端的公钥解密签名,得到散列值,然后再用数据计算md5散列看和签名里面的散列值是否一样,一样就没有篡改,不一样就是被篡改。

攻击者无法篡改数据,因为攻击者不知道前端的私钥,他可以算出新的散列值,但没法对新散列值进行加密,服务器解密的时候会发现散列值不对。

  1. MD5算法公开,对于相同的输入,输出是相同的。但是 MD5一般会配合一个密钥使用,如果别人不知道密钥,一般也无法轻易获取明文
  2. 在 Web 端所有加密手段都是防君子不防小人,毕竟你所有的源码,包括密钥都是可以通过浏览器打开的
  3. HTTP协议中,服务器并不知道客户端的状况,因此,攻击者修改数据同时也修改签名的情况下发给服务器,服务器是不知情的
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏