JWT 在应用中一些理解

JWT

 public static String geneJsonWebToken(User user){

        String token =Jwts.builder().setSubject(SUBJECT)
                .claim("head_img",user.getHeadImg())
                .claim("id" ,user.getId())
                .claim("name" ,user.getName())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis()+EXPIRE))
                .signWith(SignatureAlgorithm.HS256,SECRET).compact();

        token =TOKEN_PREFIX +token;

        return token;
 }

这段代码使用了 JWT(JSON Web Token)技术来生成一个令牌(token),用于认证和授权。

JWT 是一种基于 JSON 格式的轻量级认证和授权协议,它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

头部(Header):描述 JWT 的元数据,包含算法和类型等信息。通常使用 Base64 编码来表示。

载荷(Payload):存放实际要传输的用户信息,如用户 ID、用户名、过期时间等。也通常使用
Base64 编码来表示。

签名(Signature):对头部和载荷进行签名,以保证 JWT 的完整性和真实性。签名通常使用密钥对数据进行加密,生成一段不可逆转的字符串。

下面是这段代码的详细解释:

Jwts.builder():使用 JWT 工厂类 Jwts 创建一个 JWT 构建器。

setSubject(SUBJECT):设置 JWT 的主题(Subject),即令牌的持有者。

claim(“head_img”,user.getHeadImg()):设置一个自定义的声明(Claim),其中键为 “head_img”,值为用户的头像。

claim(“id”,user.getId()):设置一个自定义的声明,其中键为 “id”,值为用户的 ID。

claim(“name”,user.getName()):设置一个自定义的声明,其中键为 “name”,值为用户的姓名。

setIssuedAt(new Date()):设置 JWT 的签发时间,即当前时间。

setExpiration(new Date(System.currentTimeMillis()+EXPIRE)):设置 JWT 的过期时间,即当前时间加上一个固定的时间间隔(单位为毫秒)。

signWith(SignatureAlgorithm.HS256,SECRET):对 JWT 的头部和载荷进行签名,使用 HS256 算法和一个密钥(SECRET)进行签名。

compact():生成最终的 JWT 字符串,即包含头部、载荷和签名的完整字符串。

在这段代码中,JWT 的载荷包含了一些用户信息,如用户 ID、用户名、头像等。这些信息会被加密签名后生成 JWT 字符串,然后返回给客户端。客户端在后续的请求中可以携带这个 JWT 字符串作为身份认证凭证,服务器接收到请求后可以解密 JWT 字符串并验证其完整性和真实性,从而确定请求的真实发起者和权限等级,进而执行相应的业务逻辑

密钥(SECRET)

密钥(SECRET)在 JWT 技术中非常重要,它用于对 JWT 的头部和载荷进行签名,以确保 JWT 的完整性和真实性。

具体来说,当服务器生成 JWT 时,它会使用一个密钥对 JWT 的头部和载荷进行签名,生成一段不可逆转的字符串。在后续的请求中,客户端会将这个 JWT 字符串携带在请求头或请求参数中,发送给服务器。服务器在接收到请求后,会解密 JWT 字符串,验证其完整性和真实性,以确定请求的真实发起者和权限等级。

因此,密钥的作用是确保 JWT 的完整性和真实性,防止 JWT 被篡改或伪造。只有拥有正确的密钥,才能对 JWT 进行有效的签名和解密。因此,密钥必须保密,不能暴露给其他人,否则会导致 JWT 的安全性受到威胁。

通常情况下,密钥是由服务器自动生成并保存在安全的地方,只有服务器自己知道密钥的值。在生成 JWT 时,服务器会使用这个密钥对 JWT 进行签名;在验证 JWT 时,服务器会使用同样的密钥对 JWT 进行解密和验证。因此,密钥的安全性非常重要,服务器需要采取一些措施来防止密钥被泄露或攻击。

签名

签名(signature)是一种用于验证数据完整性和真实性的技术。它通常使用一种加密算法对数据进行计算,生成一段固定长度的字符串,这个字符串称为签名。

签名的生成过程包括两个步骤:签名生成和签名验证。

在签名生成过程中,使用一种加密算法对原始数据进行计算,生成一段固定长度的字符串,这个字符串就是签名。

在签名验证过程中,接收方使用同样的算法对原始数据和签名进行计算,生成一个新的签名,并将这个新的签名与原始签名进行比较。如果两个签名相同,则说明原始数据是完整且真实的;如果两个签名不同,则说明原始数据可能被篡改过,或者不是来自真实的发送方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值