当您使用JSON Web令牌JWT )或需要对有效载荷信息进行签名或加密的任何其他令牌技术时,设置令牌的到期日期很重要,因此,如果令牌到期,则可以假定这可能被视为安全漏洞,您拒绝使用此令牌进行任何通信,或者您决定通过使用新的到期日期更新令牌来启用该令牌。

但是使用某种类型的秘密轮换算法也很重要,因此用于签名或加密令牌的秘密会定期更新,因此,如果该秘密受到威胁,则此密钥泄漏的令牌会更少。 同样,您也可以减少机密被破坏的可能性。

有几种策略可以实现这一目标,但是在这篇文章中,我将解释我如何在几年前开发的一个项目中实施秘密轮换
具有HMAC算法的JWT令牌。

我将展示如何在Java中创建JWT令牌。

try {Algorithm algorithm = Algorithm.HMAC256("secret");String token = JWT.create().withIssuer("auth0").sign(algorithm);} catch (UnsupportedEncodingException exception){//UTF-8 encoding not supported
} catch (JWTCreationException exception){//Invalid Signing configuration / Couldn't convert Claims.
}

请注意,这里您需要做的是创建一个算法对象设置HMAC算法,并设置用于签署和验证实例的密钥。

因此,我们需要每X分钟旋转一次该算法实例,因此破解密码的机率以及破解的密码仍然有效的机率变得非常低。

那么如何旋转秘密呢? 好吧,通过一个非常简单的算法,每个人(即使您不是加密专家)也可以理解。 只是在浪费时间。

因此,要生成秘密,您需要一个字符串,在上一个示例中,它是秘密字符串,当然,它并不是那么安全,因此我们的想法是通过根(我们称为“大爆炸”部分)来构成此秘密字符串+兼职。 总之,秘密是<bigbang> + <timeInMilliseconds>

Bing bang部分没有任何奥秘,它只是静态部分,例如my_super_secret

有趣的部分是时间部分。 假设您想每秒更新一次秘密。 您只需要这样做:

long t = System.currentTimeMillis();System.out.println(t);
System.out.println((t/1000)*1000);TimeUnit.MILLISECONDS.sleep(50);t = System.currentTimeMillis();
System.out.println((t/1000)*1000);

我只是将0设置为毫秒部分,所以如果运行此命令,我将得到类似以下内容:

1515091335543
1515091335500
1515091335500 

请注意,尽管在第二和第三次打印之间已经过了50毫秒,但时间部分是完全相同的。 在同一秒内将是相同的。

当然,这是一个极端的示例,其中秘密每秒钟更改一次,但其想法是您删除要忽略的部分时间,并用0填充。 因此,首先,您要除以时间,然后再乘以相同的数字。

例如,假设您想每10分钟旋转一次秘密,您只需要除以600000就可以了。

这种方法有两个问题可以解决,尽管其中一个并不是很大的问题。

第一个是因为如果您想每分钟更改一次机密,则您要截断时间,例如,第一次计算是在一分钟的中间进行的,因此对于这种初始情况,轮换将在30秒后发生,并且不是1分钟。 这不是一个大问题,在我们的项目中,我们没有做任何修复。

第二个是在秘密轮换之前签署的令牌所发生的情况,它们仍然有效,您还需要能够验证它们,而不是使用新的秘密,而是使用先前的一个。

为了解决这个问题,我们要做的是创建一个有效窗口,其中还保留了先前的有效机密。 因此,当系统收到令牌时,将使用当前机密验证该令牌,如果该令牌通过,则我们可以进行其他任何检查并使用它,如果未通过,则令牌将由先前的机密验证。 如果通过,则重新创建令牌并使用新的秘密对其进行签名;如果未通过,则显然此令牌无效,必须拒绝。

要为JWT创建算法对象,您只需执行以下操作:

long currentTime = System.currentTimeMillis();try {return Algorithm.HMAC256("my_big_bang" + (currentTime/60000)*60000);
} catch (UnsupportedEncodingException e) {throw new IllegalArgumentException(e);
}

我真正喜欢这种解决方案的地方是:

  • 它很干净,不需要系统上的其他元素。
  • 不需要异步运行的触发线程来更新密码。
  • 它确实性能出色,您无需访问外部系统。
  • 测试服务真的很容易。
  • 验证过程负责旋转机密。
  • 这确实很容易扩展,实际上,您无需执行任何操作,可以添加越来越多的同一服务实例,并且所有实例都将同时旋转秘密,并且所有实例都将使用相同的秘密,因此轮换过程实际上是无状态的,您可以按比例放大或缩小实例,所有实例将继续能够验证其他实例签名的令牌。

但是当然有一些缺点:

  • 您仍然需要以安全的方式向每个服务共享机密的一部分(大爆炸部分)。 也许使用Kubernetes机密,Hashicorp的Vault,或者如果您不使用微服务,则可以将文件复制到具体位置,并在服务启动和运行时阅读大爆炸部分,然后将其删除。
  • 如果您的物理服务器位于不同的时区,则使用此方法可能会遇到更多问题。 另外,您需要使服务器或多或少同步。 由于您要存储以前的令牌和当前令牌,因此不必在同一秒内同步它们,并且几秒钟的延迟仍然可能没有问题。

因此,我们已经看到了一种非常简单的秘密轮换方式,可以使令牌更安全。 当然,还有其他方法可以做到这一点。 在本文中,我只是解释了我是如何在三年前开发的整体应用程序中做到这一点的,它确实运行良好。

我们不断学习,

亚历克斯

翻译自: https://www.javacodegeeks.com/2018/01/secret-rotation-jwt-tokens.html

JWT令牌的秘密轮换相关推荐

  1. jwt令牌_JWT令牌的秘密轮换

    jwt令牌 当您使用JSON Web令牌 ( JWT )或需要对有效载荷信息进行签名或加密的任何其他令牌技术时,设置令牌的到期日期很重要,因此,如果令牌到期,则可以假定这可能被视为安全漏洞,您拒绝使用 ...

  2. Spring Cloud Feign如何实现JWT令牌中继以传递认证信息

    在上一篇实现了Spring Cloud资源服务器的定制化,但是又发现了一个新的问题,Spring Cloud微服务调用的过程中需要令牌中继.只有令牌中继才能在调用链中保证用户认证信息的传递.今天就来分 ...

  3. JWT令牌创建和解析讲解

    JJWT的介绍和使用 JJWT是一个提供端到端的JWT创建和验证的Java库.永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解.它被设计成一个以建筑为中心的流畅界面 ...

  4. ASP.NET Core 基于角色的 JWT 令牌

    原文:https://bit.ly/3vYljq3 作者:Rick Strahl 翻译:精致码农-王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能会去除一些本人实在不知 ...

  5. .NET Core + JWT令牌认证 + Vue.js 通用动态权限(RBAC)管理系统框架[DncZeus]开源啦!!!...

    DncZeus 前言 关于 DncZeus DncZeus = Dnc + Zeus "Dnc"--.Net Core 的缩写: "Zeus"--中文译为宙斯, ...

  6. jwt令牌_jwt-cli:用于解码JSON Web令牌(JWT令牌)的Shell库

    jwt令牌 当我开始经常需要解码JSON Web令牌时,我感到迫切需要编写允许我快速进行操作的程序. 有很多不错的选项,例如jwt.io ,但是一旦您需要执行此操作,它通常就会变得笨拙. 并且,如果您 ...

  7. jwt令牌_JWT –生成和验证令牌–示例

    jwt令牌 JWT提供了一种非常有趣的方式来表示可以验证和信任的应用程序之间的声明. 我的目标是展示一个小的样本,它使用出色的Nimbus JOSE + JWT库来生成和验证令牌. 总览 进行介绍的最 ...

  8. Angular之jwt令牌身份验证

    Angular之jwt令牌身份验证 demo https://gitee.com/powersky/jwt 介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种 ...

  9. 在JWT令牌转获取私有化声明时出错,java.util.LinkedHashMap cannot be cast to cn.mar.crm.sys.entity.SysUser

    在JWT令牌转获取私有化声明时,执行以下代码时报错 String jwt = req.getHeader(JwtUtils.JWT_HEADER_KEY);Claims claims = this.v ...

最新文章

  1. 练习2-17 生成3的乘方表 (15 分)
  2. 2021年的疫情下的智能车竞赛
  3. 分布式计算Hadoop系列之如何Eclipse中构建Hadoop项目
  4. c语言数组算n阶乘,c语言中如何计算n的阶乘
  5. python webqq机器人_python模拟开发WebQQ(二)
  6. 运行时错误7内存溢出_C++程序运行时的内存模型
  7. [转]Android编程之BitmapFactory.decodeResource加载图片缩小的原因及解决方法
  8. Parallels Desktop如何检查Windows系统是否具有EFI/UEFI或 Legacy BIOS固件接口
  9. ftp3.0中的bug
  10. lisp用entmake生产圆柱体_液态基酒生产
  11. android 控件xpath软件_请像用户使用软件一样,享受自动化测试~
  12. sms实现wap push的方法和格式
  13. 【解决方案】重新安装Ubuntu显卡驱动
  14. php gd jpeg,怎么解决GD库不支持JPEG
  15. 爬虫 - 超级鹰的基本使用
  16. 2017年6月六级翻译明朝
  17. 数据库范式1NF 2NF 3NF详细阐述
  18. spark2.2以后版本任务调度将增加黑名单机制
  19. html手机qq登陆验证码,为什么qq登陆需要验证码?qq登陆需要验证码怎么取消?...
  20. 无人驾驶汽车系统入门(二十六)——基于深度学习的实时激光雷达点云目标检测及ROS实现

热门文章

  1. Machine Learning:十大机器学习算法
  2. Spring思维导图,让Spring不再难懂(ioc篇)
  3. 使用Java 8 Stream像操作SQL一样处理数据(上)
  4. ajax读取文件未及时更新
  5. “老师,请您多关注一下我吧!!!”
  6. Android如何实现NoActionBar以及Theme.NoTitleBar.Fullscreen效果
  7. Project编写功能点的规划时间
  8. 如何设置电脑自动锁屏_这个手机锁屏密码竟可以根据时间而变化!密码每分钟都会发生改变...
  9. windows查找端口占用并杀死端口进程
  10. linux-basic(11)认识和学习bash