当前位置: 首页 > 知识库问答 >
问题:

Android JWT解析有效负载/声明时签署

法池暝
2023-03-14

我有一个签名的JWT字符串,我从服务器上获得。我不知道密钥,或者更确切地说,我不想把密钥放在客户端/设备上。

当使用这个网站与我的令牌:https://jwt.io/我得到想要的结果,它告诉我头和有效载荷信息。

我在Android系统上找不到一个像这个网站那样的库,我已经尝试了我能找到的所有库。最受认可的方法是:https://github.com/jwtk/jjwt

但这给了我一个例外,我不能解析一个签名的令牌,正如上面的另一个网站所证明的,它是假的。我使用的另一个资源是:https://bitbucket.org/b_c/jose4j/wiki/Home

这一个至少给了我标题信息,这是我能得到的最远的信息。

为了说明原因,有效载荷包含一个过期时间,在设备上,当令牌即将过期时,我应该提示用户重新输入凭据以获取新令牌。现在这看起来像是一种安全威胁,因为黑客可以操纵设备上的令牌,但服务器会检查令牌以确保其真实性,这就是为什么我不希望设备上的密钥,因为这可能会被黑客挖掘,并使整个应用程序易受攻击。

共有3个答案

彭涵衍
2023-03-14

您可以使用jose4j的JWT consumer只进行解析,而不检查声明或签名。类似下面的内容将解析令牌,并将过期时间与当前时间进行比较,以查看它是否过期。

String jwt = "eyJhbGciOiJIUzI1NiJ9" +
        ".eyJzdWIiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNDUzODE0NjA0LCJuYW1lIjoiSm9obiBEb2UifQ" +
        ".IXcDDLXEpGN9Po5C-Mz88jUCNYrHxu6TVJLavf0NgT8";

JwtConsumer consumer = new JwtConsumerBuilder()
        .setSkipAllValidators()
        .setDisableRequireSignature()
        .setSkipSignatureVerification()
        .build();
JwtClaims claims = consumer.processToClaims(jwt);
NumericDate expirationTime = claims.getExpirationTime();

if (NumericDate.now().isAfter(expirationTime))
{
    System.out.println("Token expired at " + expirationTime);
}
else
{
    System.out.println("Token is still good until " + expirationTime);
}
师增
2023-03-14

答案很简单,尽管在我看来应该在框架中。但是一个简单的无符号JWT仍然有2个必需的周期,但是在最后一个周期之后没有任何内容,所以我把我的JWT拆分为周期,并将第一个和第二个周期与周期合并,并在末尾加上一个周期。

String[] splitToken = result.Value.Content.AuthorizationJWTToken.split("\\.");
Jwt parsedToken = Jwts.parser().parse(splitToken[0] + "." + splitToken[1] + ".");

这是使用https://github.com/jwtk/jjwt库。

卫俊力
2023-03-14

如果你想解析签名文本而不使用签名:

1-添加以下依赖项:

//JWT
compile 'io.jsonwebtoken:jjwt:0.7.0'

2-添加以下导入:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Header;
import io.jsonwebtoken.Jwt;
import io.jsonwebtoken.Jwts;

3-使用下面的代码块:

//ref : https://github.com/jwtk/jjwt/issues/135
//you can put your signatured text instead of jws variable.
String jws = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ";
int i = jws.lastIndexOf('.')
String withoutSignature = jws.substring(0, i+1);
Jwt<Header,Claims> untrusted = Jwts.parser().parseClaimsJwt(withoutSignature);
/*untrusted.getBody().getSubject();
  untrusted.getBody().getExpiration();
  etc.
*/
 类似资料:
  • 我是Spring的新手,并试图理解在我的Spring配置文件中声明的bean标记,如下所示: 我正在努力理解这5行代码。第一行表示它是一个XML文件。请有人帮我理解其他4行,以及向Spring应用程序提供这些信息的原因。

  • 我希望在我们的web应用程序中实现一些高效(即具有良好性能)的逻辑来进行有效负载签名。HTML5客户端的目标是保证接收到的有效负载的内容确实是我们后端生成的内容。 我们不想使用共享盐进行有效负载哈希生成,因为用户可以轻松打开HTML5源并找到盐短语。 我们现在已经实现了RSA签名,我们的后端使用其私钥添加有效负载签名,我们的HTML5客户端使用其烘焙的公钥验证有效负载签名。然而,签名生成过程需要2

  • 问题内容: 我正在尝试解析方法声明。基本上,我需要获取接收方基本类型()和返回类型(和)的语法节点。该程序包看起来很简单,但是由于某种原因,我没有获得所需的数据(即,字段为nil)。 唯一有用的数据似乎仅在类型为字段的字段中提供, 因此我认为我无法序列化它。 任何帮助,将不胜感激。代码如下: 操场 问题答案: 要获取类型,您需要查看可能是an 或an 的属性。 这里看看这个:

  • 问题内容: 打破并继续Java中标记语句的唯一用法吗? 您何时在程序中使用了标签语句? 抱歉,该代码段已删除。 我正在拆分问题 问题答案: [JLS 14.7带标签的语句](https://docs.oracle.com/javase/specs/jls/se14/html/jls-14.html#jls-14.7) (为清楚起见进行了编辑) 语句 可能具有标签前缀( Identifier : S

  • 我正在开发一个网站,可以连接到一个mqtt代理,并获得有效负载消息。 我使用的库是(https://eclipse.org/paho/clients/js/)。 我的问题是以下几点。当我试图获得一个标准压缩消息(gzipped)时,库抛出一个异常“错误:AMQJS0009E Malformed UTF Data:F53-52”。 如何处理压缩消息? 下面是我的代码:

  • 本文向大家介绍spring声明式事务管理解析,包括了spring声明式事务管理解析的使用技巧和注意事项,需要的朋友参考一下 前沿:通过对spring事务管理有了比较深入学习,本文将不做实例,而是指定具体的类和配置文件进行讲解。 本文内容:   1、了解什么是声明式事务?   2、声明式事务管理分别有哪几种?   3、这几种事务管理之间的区别是什么? 一、什么是声明式事务?   声明式事务(decl