8 回答

TA贡献1827条经验 获得超9个赞
先不管JWT和SESSION机制,我来讨论下网络安全问题,可能说的不对,欢迎指正。
假定现在你的电脑不安全,电脑中被安装了木马监听,同时网关里有也中间人:
- 无论你的网页中是否加密,你在键盘中输入的任何数据都会被木马监听到,这是操作系统层的监听;
- 你在网页中键入的请求以及接收到的响应,通过网关都会被中间人拦截,这是路由层的监听;
所以,加密密码必须采用哈希算法,而不是对称加密;不然中间人既然可以拦截所有的请求和响应,而js又是明文,你如何保证对称加密的秘钥不被中间人看到呢?
你可能会问加密的密码也会被看到,中间人也可以绕开网页,直接发包模拟请求。是的,确实如此;加密密码解决的是不让你的密码被明文泄露,这样中间人无法用你的账户密码去其他应用中撞库。
但是传输的主体内容是不能采用哈希算法,因为双方必须知道具体的内容,这导致了中间人会看到明文的内容;(简单的JS对称加密是无用的,因为HTML是明文的,中间人也可以看到对称加密的秘钥)
HTTPS解决的就是对称加密的问题,将证书提前准备好,并通过浏览器预先安装的根证书来避免中间人伪造证书,这从根本上解决对称加密的秘钥问题。
而JWT我觉得从根本上,并不是为了解决网页安全问题,而是想通过一种分布式无状态的方式来解决服务端的SESSION问题。

TA贡献1848条经验 获得超2个赞
我只要拦截到你加密后的值,还不是一样可以用么。
假设你的账号是ABCDE,加密后是EDCBA,我完全不需要解密得到你账号,我只需要把加密后的值原样传给你的后端就能拿到权限。

TA贡献1772条经验 获得超8个赞
- https应该是简单而有效的方法。
- 如果你没有解决传输被偷听的问题,那么就必须解决“重放”的问题
比如,你将密码用md5加密后再传,那别人也可以截获你md5后的密码进行重放。就算你的密码不但md5加密了,还用非对称加密再包一层,别人同样截获的是你最终的加密结果来重放。
用户的密码是不变的,如何让一个“密码”只能有效一次,是解决重放的关键思路,一般可以用黑白名单的方式来实验,具体可以自己试试。
另外,登录成功后使用JWT时,要注意JWT必须有“有效时间”的判断,否则,一旦jwt被拦截窃取,会持续有效,直到你改secret

TA贡献1773条经验 获得超3个赞
token被拦截,拿到token,没有key也无法破解token啊,jwt只是来表明用户身份信息的,一般不会把密码信息放入其中,客户端处理的方式不安全
- 8 回答
- 0 关注
- 1976 浏览
添加回答
举报