看一些博客说前端发送的数据经过MD5生成哈希值,如果被坏人劫持更改了原始数据,那么哈希值就会改变,服务器把更改过的数据用MD5生成哈希值发现和前端传的哈希值不一样,就拒绝请求。
但是坏人即然能更改前端发送的原始数据,为啥不能把哈希值也替换掉呢,只要把篡改的数据也用MD5加密生成个新的哈希值也发给服务器,服务器不就不知道篡改过了吗?
我用js使用MD5加密的时候直接百度搜的一个MD5.js,也就是MD5算法是公开一样的?那么坏人使用同样的MD5算法加密篡改后的数据不就行了?
看一些博客说前端发送的数据经过MD5生成哈希值,如果被坏人劫持更改了原始数据,那么哈希值就会改变,服务器把更改过的数据用MD5生成哈希值发现和前端传的哈希值不一样,就拒绝请求。
但是坏人即然能更改前端发送的原始数据,为啥不能把哈希值也替换掉呢,只要把篡改的数据也用MD5加密生成个新的哈希值也发给服务器,服务器不就不知道篡改过了吗?
我用js使用MD5加密的时候直接百度搜的一个MD5.js,也就是MD5算法是公开一样的?那么坏人使用同样的MD5算法加密篡改后的数据不就行了?
MD5
校验,这样可以防止一批攻击;其实如果不是铁了心跟你卯下去的攻击者,大多数中间人是交给漏洞扫描脚本来试探接口的。脚本一般只会抓包改包,如果改了的包无效,它就放过了,因为进一步分析本地的加密过程需要人工介入,脚本仔们没那么多功夫给你抓虱子,他们甚至可能看不懂 JS
。
没用,如果只是防止中间人攻击, HTTPS 已经做得非常好了,并且远超你这个设计。
参考如下视频
如果是为了防止调试,也没有太大意义,因为你的密钥是要存储的,前端是需要得到这个密钥的,无论什么方式,别人都能拿到你的密钥。
微信支付的签名验证是纯后端服务器与微信服务器进行交换数据的,密钥也是在双方服务器存储的,并没有把密钥下发到客户端,场景完全不一样。
光是md5/sha之类的散列是不能确保数据不受篡改,要辅以非对称加密算法对散列值进行签名,就可以确保数据没有被篡改。
非对称加密算法如rsa,ecc等,有两个密钥,一个公钥一个私钥,用公钥加密数据之后只能用私钥才能解密,反过来也如此。
前端用rsa生成一个密钥对,自己留着私钥,把公钥公开,所有人都知道公钥,然后前端发送一个数据,用md5计算数据的散列值,然后再用私钥对散列值进行加密之后得到一个密文,称为签名,把数据和签名发给服务器,服务器用前端的公钥解密签名,得到散列值,然后再用数据计算md5散列看和签名里面的散列值是否一样,一样就没有篡改,不一样就是被篡改。
攻击者无法篡改数据,因为攻击者不知道前端的私钥,他可以算出新的散列值,但没法对新散列值进行加密,服务器解密的时候会发现散列值不对。
密钥
使用,如果别人不知道密钥,一般也无法轻易获取明文防君子不防小人
,毕竟你所有的源码,包括密钥都是可以通过浏览器打开的10 回答11.4k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.9k 阅读✓ 已解决
3 回答5.2k 阅读✓ 已解决
4 回答4.5k 阅读✓ 已解决
1 回答3.5k 阅读✓ 已解决