JWT 安全性相关问题

1、jwt如何防止重放攻击?

重放攻击定义

重放攻击(英语:replay attack,或称为回放攻击)是一种恶意或欺诈的重复或延迟有效数据的网络攻击形式。 这可以由发起者或由拦截数据并重新传输数据的对手来执行,这可能是通过IP数据包替换进行的欺骗攻击的一部分。 这是“中间人攻击”的一个较低级别版本。
这种攻击的另一种描述是: “从不同上下文将消息重播到安全协议的预期(或原始和预期)上下文,从而欺骗其他参与者,致使他们误以为已经成功完成了协议运行。”

解决方案 

加时间戳

首先,常见的解决方案就是在请求报文里面加上时间戳,并参与加签。

当接收方收到报文,经过验签之后。

首先第一个事儿就是拿着请求中的时间戳字段和本地时间做个对比。

如果时间误差在指定时间,比如 60 秒内,那么认为这个请求是合理的,程序可以继续处理。

为什么要有一个时间容错范围,能理解吧?

因为报文的传输、解密、验签是需要时间,不能假设我这一秒发出去,下一秒服务端就收到了。

所以,得有时间容错范围。

但是这个容错范围又带来了另外一个问题。

不能完全避免重放攻击。

至少时间容错范围内,比如 60 秒,重发过来的请求,服务端认为是有效的。

那么怎么办呢?

加随机串

换个思路,我们在请求报文里面加个随机串,然后让它参与加签。

接受方收到报文,验签之后,把随机串拿出来,来判断一下这个随机串是否已经处理过了。比如判断一下是否存在于 Redis 里面。

当请求再次重放过来的时候,一看:嚯,好家伙,这个随机串已经被用过了呀,不处理了。

在这个情况下,随机串就得保证唯一性了,还得历史全局唯一。

因为你指不定哪天就收到一个几天前的被重放过来的请求。

确实是解决了请求重放的问题,但是弊端也很明显:历史全局唯一。

我还得存储下来,而且存储的数据量还会越来越大,是不是有点麻烦了?

确实麻烦了。

这个思想就和用全局唯一流水号去保证接口幂等性很像了。

所以,我第一次遇到这个面试题的时候,我朝着接口幂等的角度去回答了,也不能说回答的不对。

只能说回答的不是面试官想要的标准答案。

那么什么是面试官想要听到的回答呢?

时间戳+随机串

时间戳的问题是有一定的时间容错窗口,这个时间窗口内的重放攻击是防不住的。

随机串的问题是要保证历史全局唯一,保存随机串成了一个麻烦的事情。

那么当我们把这两个方案揉在一起的时候,神奇的事情就发生了:

我只需要保证时间窗口内的生成的随机串不重复就行。

而且假设时间窗口为 60 秒,我们用 Redis 来记录出现过的随机串,那么这个串在后台的超时时间设置为 60 秒就行。

一般来说这个时间窗口都不会太长了,我对接过这么多各种各样的渠道,见过最长的也就 5 分钟。

保证 5 分钟内生成的两个随机串不重复,这个需求比保证实现一个历史全局唯一的流水号容易实现多了吧?

另外,最关键的一句话一定要说:时间戳和随机串得参与到加签逻辑中去。

这个很好理解吧?

接受方看报文是否被篡改,看的就是签名是否能匹配上。

而签名的结果是和参与签名的字段的值有直接关系的。

要是你时间戳和随机串不参与加签,那么任意修改时间戳或者随机串,都不会引起签名的变化,那不白忙活一场吗?

中间人咔一下拦截到请求,发现有时间戳和随机串,正准备放弃的时候,想着死马当做活马医,把随机串一改,又扔给接收方了。

结果收到正确的响应了。

2、JWT如何保证token安全

1.使用加密算法再对token加一次密,一种可行的方式是使用对称加密算法,如AES,使用一个密钥对 Token 进行加密和解密.
2.存储在HttpOnly Cookie 上,HttpOny Cookie 禁 JavaScript 访河 Cookie。可以有效防范xss攻击,但不能完全防范。为了更好地保护 Web 应用程序,需要采取多种安全措施,如输入验证、输出编码和身份验证等。
3.使用 HTTPS 协议传输数据,以保障数据传输的安全性。
4.通过设置短暂有效期来减少 JWT token 被盗用的风险
5.将JWT token 存储在 HttpOnly Cookie 中,以防止 XSS 攻击窃取 JWT token.
6.使用签名来验证 JWT token 的完整性,以防止攻击者篡改 JWT token。
7.避免在 JWT token 中包含敏感信息,例如用户的密码
8.使用多因素身份验证等措施来提高账户的安全性。

3、token被人窃取了怎么办?

采用https 或者代码层面也可以做安全检测,比如ip地址发生变化,MAC地址发生变化等等,可以要求重新登录,设置有效期

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值