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

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

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

相关文章

重温6 ListView相关|单位dp/sp

dp:密度无关像素。 sp&#xff1a;可伸缩像素。解决文字大小适配问题。 密度&#xff1a;Android中的密度即屏幕每英寸所包含的像素数&#xff0c;通常以dpi为单位&#xff0c;例如一个宽2英寸长3英寸手机屏幕&#xff0c;若分辨率为320*480&#xff0c;则屏幕密度为320dpi。…

wso2 esb_通过运行示例从WSO2 ESB开始

wso2 esb我最近加入了一个新任务&#xff0c;我们必须基于WSO2工具栈实施ESB解决方案。 尽管我熟悉ESB的大多数概念以及其他一些实现&#xff08;例如Mule ESB &#xff09;&#xff0c;但这是我第一次必须使用WSO2 ESB 。 幸运的是&#xff0c;有很多文档可以找到&#xff0c;…

持久化技术SharedPreferences存储

public interface SharedPreferences android.content.SharedPreferences Class Overview Interface for accessing and modifying preference data returned by getSharedPreferences(String, int). 1、调用SharedPreferences对象的edit()方法获得SharedPreferences.Editor对象…

我们相信加密! 教程

许多人认为加密是一个复杂的主题&#xff0c;这很难理解。 虽然可以实现它的某些方面&#xff0c;但是每个人都可以理解它在更高层次上的工作方式。 这就是我要处理的这篇文章。 用简单的术语解释它是如何工作的&#xff0c;然后使用一些代码。 是的&#xff0c;我们信任加密…

使用Http协议访问网络--HttpURLConnection

public abstract classHttpURLConnection extends URLConnectionjava.lang.Object ↳java.net.URLConnection ↳java.net.HttpURLConnection 1、获取HttpURLConnection实例Protected ConstructorsHttpURLConnection(URL url)Constructs a new HttpURLConnection instance …

Spring Cloud –基本设置

Spring Cloud解决了分布式系统的常见问题。 但是&#xff0c;对于只使用广为人知的整体应用程序工作的人来说&#xff0c;从一开始就跳入一长串为分布式服务设计的模式可能会让人不知所措。 本文将通过实用的方法为您介绍Spring Cloud的基础知识。 完成后&#xff0c;您不仅应该…

Eclipse中的Tomcat:6个流行的“如何做”问题

学习新技术总是一个艰难的过程。 当您尝试学习将要相互交互的两种技术时&#xff0c;此过程变得更加困难。 Tomcat和Eclipse是Java EE开发中最流行的先决条件之一。 因此&#xff0c;要成为一名专业的开发人员&#xff0c;您需要知道如何使用此对执行最需要的操作以及如何进行一…

Spring Boot中带有CKEditor的AJAX

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

使用Http协议访问网络--HttpClient

public interface HttpClient org.apache.http.client.HttpClient HttpClient是Apache提供的Http网络访问接口。1、创建HttpClient实例HttpClient是一个接口&#xff0c;无法直接创建实例&#xff0c;通常创建一个DefaultHttpClient&#xff08;HttpClient 的SubClass&#xff…

编写测试用例

1、创建测试用例 为ComeOnBroadcastReceiverDo创建一个测试用例&#xff1a; 在导航栏File-->New-->Other 选择AndroidTestProject 2、点击next输入测试工程的name&#xff0c;选择测试工程路径 点击next,选择要测试的工程&#xff1a; 点击Finish完成测试工程的新建 被…

欢迎界面动画

实现一个欢迎界面的动画&#xff0c;即打开app显示的页面&#xff0c;动画结束后跳到Activity。 1、欢迎界面的背景是一个绿色矩形 <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/andr…

IP地址分类及ISO-OSI、三次握手

1. A类地址A类地址的表示范围为&#xff1a;0.0.0.0~126.255.255.255(00000000~01111110)&#xff0c;最前面一位是“0”&#xff0c;用7位&#xff08;bit&#xff09;来标识网络号&#xff0c;24位标识主机号&#xff1b;默认网络掩码为&#xff1a;255.0.0.0&#xff0c;111…

drools 决策表_骆驼和春天的Drools决策表

drools 决策表正如我在之前的文章中所展示的那样&#xff0c; JBoss Drools是一个非常有用的规则引擎 。 唯一的问题是&#xff0c;对于非技术人员而言&#xff0c;以Rule语言创建规则可能会非常复杂。 这就是为什么人们可以提供一种简便的方法来创建业务规则-在电子表格中创建…

在Java中处理异常

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

通信系统的组成

数字通信模型&#xff1a; http://blog.csdn.net/yaosiming2011/article/details/44280797 进程和线程

存储卡显示0字节怎么办?恢复0字节的存储小技巧

存储卡显示0字节是一个常见的故障现象&#xff0c;可能由多种原因引起。本文将详细分析存储卡出现此类问题的各种原因&#xff0c;并提供针对性的解决方法。通过深入了解这些原因和解决方案&#xff0c;读者可以有效地应对存储卡显示0字节的故障&#xff0c;从而恢复存储卡的正…

OSI模型和TCP/IP协议族

1、协议分层 两个实体之间要进行通信就需要有一个协议。而当通信比较复杂时就有必要将这个复杂的任务划分为多层&#xff0c;就需要有多个协议&#xff0c;每一层都有自己的协议。 2、ISO 国际标准化组织&#xff08;International Standard Organization &#xff0c; ISO&…

在PhotoShop中改像素m*n

快捷键&#xff1a;CtrlAlti&#xff0c;如图&#xff0c;改为28*28

Spring Boot Redis简介

1.概述 在本文中&#xff0c;我们将通过Spring Data Redis库回顾如何将Redis与Spring Boot结合使用的基础知识。 我们将构建一个应用程序&#xff0c;演示如何通过Web界面执行CRUD操作Redis 。 Github上提供了该项目的完整源代码。 2.什么是Redis&#xff1f; Redis是一个开源…