jwt令牌_JWT令牌的秘密轮换

jwt令牌

当您使用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令牌

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jasperreports_JasperReports:棘手的部分

jasperreports如果您使用Java进行编程的时间足够长&#xff0c;则有可能需要为业务用户生成报告。 就我而言&#xff0c;我已经看到几个项目使用JasperReportsLibrary来生成PDF和其他文件格式的报告。 最近&#xff0c;我荣幸地观察了Mike和他的团队使用上述报告库以及他们所面…

电脑运行adb闪退_adb+python进阶使用

之前文章有提到过使用python加adb刷视频&#xff0c;今天带来进阶版——无线多台手机。首先要使用adb连接多台手机&#xff0c;手机和电脑肯定要在统一局域网内。1.打开手机开发者模式&#xff0c;并通过USB接口链接电脑。2.打开cmd&#xff1a;输入adb tcpip 5555, 会得到相关…

java office在线编辑_国外10个最受欢迎的 Java 开发的 CMS 系统

CMS是Content Management System的缩写&#xff0c;意为"内容管理系统"&#xff0c;它具有许多基于模板的优秀设计&#xff0c;可以加快网站开发的速度和减少开发的成本。CMS的功能并不只限于文本处理&#xff0c;它也可以处理图片、Flash动画、声像流、图像甚至电子…

apache kafka_Apache Kafka简介

apache kafka什么是Apache Kafka&#xff1f; Apache Kafka是一个分布式流系统&#xff0c;具有发布和订阅记录流的功能。 在另一方面&#xff0c;它是企业消息传递系统。 它是一个快速&#xff0c;水平可扩展和容错的系统。 Kafka有四个核心API&#xff0c; 生产者API&#x…

人脸特征值能存放在sql server中吗_SQL运行内幕:从执行原理看调优的本质

原文链接&#xff1a;https://www.cnblogs.com/arthinking/p/13205303.html相信大家看过无数的MySQL调优经验贴了&#xff0c;会告诉你各种调优手段&#xff0c;如&#xff1a;避免 select *&#xff1b;join字段走索引&#xff1b;慎用in和not in&#xff0c;用exists取代in&a…

rest资源设计_REST资源何时应获得其自己的地址?

rest资源设计在纯粹的REST方法中&#xff0c;所有端点&#xff08;起始端点除外&#xff09;都是不透明的&#xff0c;因此不需要发布其各种详细信息。 即使使用这种方法&#xff0c;本文中的要点也很重要&#xff0c;因为服务器逻辑将必须确定何时需要结束点。 介绍 在REST体…

ckeditor回显带标签_Spring Boot中带有CKEditor的AJAX

ckeditor回显带标签1.概述 在本文中&#xff0c;我们将介绍如何在Spring Boot中使用CKEditor 。 在本教程中&#xff0c;我们将导入一个包含大量数据的XML文档&#xff0c;对使用GET请求将一组数据加载到CKEditor实例的能力进行编程&#xff0c;并执行POST请求以保存CKEditor的…

android 可行性分析,可行性研究项目分析程序与步骤

项目分析程序项目分析分析工作步骤分析程序框架分段实施方法第一阶段初期工作1、收集资料。包括业主的要求&#xff0c;业主已经完成的研究成果&#xff0c;市场、厂址、原料、能源、运输、维修、共用设施、环境、劳动力来源、资金来源、税务、设备材料价格、物价上涨率等有关资…

原码一位乘法器设计_十分钟带你彻底搞懂原码、反码、补码

点击上方“程序员大白”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达编辑 | 程序员大白公众号来源丨https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html仅作学术交流&#xff0c;如有侵权&#xff0c;请联系删文本篇文章讲解了计算…

Linux 目录之 /etc/init.d/ 介绍

文章目录一、关于目录 /etc/init.d/二、关于目录 /etc/rc.d/init.d/三、关于文件 /etc/rc.local四、/etc/init.d/ 和 service 文件五、关于命令 service六、关于文件 /etc/inittab七、关于目录 /etc/init/注意&#xff1a;以 System V init 或者 Upstart 为初始化系统的 Linux …

java 异常处理发生异常_处理Java中的异常

java 异常处理发生异常每个程序员都希望编写一个完美的程序。 也就是说&#xff0c;程序运行时没有任何障碍。 好吧&#xff0c;如果希望是马&#xff0c;乞g就会骑。 除了程序员的所有愿望之外&#xff0c;有时还会发生无法预料的情况。 在Java中&#xff0c;这些无法预料的…

android提交项目到svn,Android Studio 配置SVN,通过Share project提交项目和实现忽略文件...

1&#xff1a;首先电脑本身装的SVN必须在bin目录下包含svn.exe文件&#xff0c;如下图。这个文件是在安装SVN时选择安装command line client tools才会出现。如果没有&#xff0c;需要重新安装SVN。2&#xff1a;将SVN关联到Android Studio中声明&#xff1a;在这里我使用的And…

数独游戏技巧从入门到精通_如何引导孩子入门九宫格数独?掌握4个技巧口诀,孩子思维提升快...

九宫格数独对孩子的思维训练有着非常不错的效果&#xff0c;我们完全可以用其培养孩子对数字的兴趣&#xff0c;并培养孩子严谨的逻辑推理态度。那九宫格数独有没有技巧口诀呢&#xff1f;对于孩子来说&#xff0c;过于复杂的技巧他们也掌握不了。所以&#xff0c;我们培养孩子…

Spring Boot和Apache Camel

随着软件世界的发展&#xff0c;正在开发更加复杂的系统&#xff0c;这些系统必须相互集成。 它从SOA开始&#xff0c;然后一直到微服务。 骆驼是我想到的第一大集成工具&#xff0c;因为如今的骆驼springboot是一个非常强大的组合。 第一步是将骆驼依赖项包含到我们的sprin…

苹果android投屏,iphone怎么投屏到mac?苹果手机投屏到苹果电脑方法

iphone和mac的使用人群越来越多,其中投屏功能却难倒了大部分新手用户,许多使用iPhone以及Mac的用户朋友都还不知道iPhone怎么投屏到mac,好奇的用户朋友马上点击查看iphone投屏到mac教程来实现这个具有科技革新感的功能吧。官方推荐方法1&#xff1a;用数据线- 1.使用lightning线…

微服务java模块内存管理_Java 9模块服务

微服务java模块内存管理接线与查找 Java长期以来都有一个ServiceLoader类。 它是在1.6中引入的&#xff0c;但是自Java 1.2以来就使用了类似的技术。 一些软件组件使用了它&#xff0c;但是使用并不广泛。 它可以用于模块化应用程序&#xff08;甚至更多&#xff09;&#xff0…

使用实例工厂方法实例化_一些工厂实例

使用实例工厂方法实例化我时不时地发现自己摸索了一些旧代码&#xff0c;找到了“我在哪里做过类似工厂的事情”的示例。 上周再次发生这种情况时&#xff0c;我决定只查找所有示例&#xff0c;并创建一个示例项目和有关该示例的博客文章。 所以在这篇文章中&#xff0c;我&a…

linux内核设计与实现 epub_Epoll学习服务器的简单实现-Linux内核Epoll结构

1.Begins~有的人学习linux编程很久&#xff0c;只知道网络编程是socket&#xff0c;bind&#xff0c; listen。。。&#xff0c;然而这些都是网络通信软件最基本的接口。在某网络公司待了y&#xff0c;也了解到公司的基础就是网络转发 &#xff0c;然而网络转发实现并非我们平时…