网站开发语言占有率,下载赶集网招聘最新招聘,googl浏览器做桌面版网站,品牌设计理念文章目录 什么是令牌技术为什么需要令牌技术呢JWT 令牌JWT 组成JWT 令牌的使用1. 引入 JWT 依赖生成 JWT 令牌解析 JWT 令牌 什么是令牌技术
令牌技术是一种重要的安全技术#xff0c;它在多个领域中发挥着关键作用。简单来说#xff0c;令牌#xff08;Token#xff09;可… 文章目录 什么是令牌技术为什么需要令牌技术呢JWT 令牌JWT 组成JWT 令牌的使用1. 引入 JWT 依赖生成 JWT 令牌解析 JWT 令牌 什么是令牌技术
令牌技术是一种重要的安全技术它在多个领域中发挥着关键作用。简单来说令牌Token可以被视为系统的临时密钥相当于账户名和密码用于决定是否允许特定的请求并判断该请求来自哪个用户。
在网络安全领域令牌技术被广泛应用。它允许用户在不提供密码或其他凭证的前提下访问网络和系统资源。这些令牌在系统中持续存在直到系统重新启动。令牌的一个显著特点是其随机性和不可预测性这使得黑客或恶意软件很难猜测出令牌的内容。
在支付领域令牌技术则表现为一种虚拟账号技术。它将用户持有的信用卡或借记卡的16位主账号转化为一个与之对应的虚拟账号并与具体的设备如智能手机绑定。如果发生黑客入侵事件用户的真实卡号已经被令牌技术转化为虚拟账号即使黑客获取了这个电子令牌也无法直接利用。此外如果用户的设备丢失金融机构可以简单地使该设备上的电子令牌失效从而保护用户的账户安全。
以苹果支付为例它正是应用了令牌技术。这种技术不仅提高了支付的安全性还大大节约了成本因为金融机构无需在每次安全风险事件发生后都发放新的实体卡。
此外OTP一次性密码令牌也是一种令牌技术的体现。它采用一种算法每隔一段时间如60秒生成一个不可预测的随机数字组合作为一次性的登录密码。这种技术增强了账号的安全性因为它避免了定期更换密码的繁琐同时也减少了密码被猜测或破解的风险。
简单点来说令牌技术就是一个用户身份的标识名称起的很高大上其实本质上就是一个字符串。
为什么需要令牌技术呢
给大家举个例子对于一个用户量很大的软件来说它的服务器的数量肯定不止一个因为如果只有一个服务器的话对于多个客户端发来的请求一个服务器短时间内是无法及时处理这些请求的话如果在短时间内客户端的请求数量达到了服务器能处理的最大数量的请求的话那么这个服务器就可能会发生宕机的问题那么所有客户端的请求就无法得到处理出现这样的问题就会造成很大的损失。
所以为了避免出现单个服务器出现宕机的问题一个应用的背后会有多个服务器并且通过负载均衡的做法来将不同数量的请求分配给指定的服务器如果一个服务器当时可以接收的请求量较大的话通过负载均衡的做法该服务器就可以得到较多数量的在承受范围之内的请求数量对应的对于那些当时可以接收的请求数量较少的服务器来说通过负载均衡的操作该服务器得到的请求的数量就较少这样就极大的降低了服务器出现宕机的问题。 但是通过负载均衡的做法的话又会出现其他的问题对于网站上用户的操作往往需要先对用户的登录状态进行判断对于一些操作只有用户登录之后才可以进行而通常的判断用户是否登陆的的方法就是通过是否存在 Session 会话来判断当用户成功登录之后呢就创建出类似哈希表的结构将 Session 存储在服务器本地然后通过响应将 SessionId 返回给客户端并且存储在 Cookie 中下一次客户端发送请求之后就会将这个 SessionId 发送给服务器服务器拿到请求的数据包之后就可以根据这个 SessionId 来判断用户是否登录了。但是既然 Session 会话是存储在服务器本地那么当有多个服务器的时候如果用户前两分钟发送的登录请求是在服务器 A 中处理的话那么当前会话就是在服务器 A 的本地存储的那么如果过了两分钟之后用户又发送了其他操作请求的话这时因为负载均衡的操作该请求被分配到服务器 B 中去处理的话服务器 B 就会先判断用户是否登录根据客户端发来的请求中的 SessionId 来获取会话但是因为服务器 B 中没有存储对应的会话所以就会强制用户进行登录这时用户就会问了我不是刚刚登录了吗为什么又让我登录呢这是哪个xx写的程序。这样就会极大的影响用户的使用体验。
所以为了解决这个问题就出现了令牌技术令牌技术会将令牌存储在客户端的浏览器上而不是服务器上当客户端发送请求的时候将这个令牌也发送给服务器服务器得到这个令牌之后就会对这个令牌进行解析如果解析成功就可以认定该用户处于登录状态反之则强制用户进行登录。
给大家举个例子在之前网络还不发达的时候如果我们需要住酒店的时候我们进去酒店的时候需要将身份证交给负责人员但是当我们进行其他也需要身份证的操作的时候因为我们的身份证在酒店负责人那里所以我们就需要先去酒店负责人那里拿身份证然后才能继续但是现在我们的身份信息都被录入了公安系统我们需要住酒店只需要刷身份证之后身份证就会归还给我们了那么我们就可以去干其他的事了这也就是能证明自己身份的信息在用户手中的好处。
JWT 令牌
实现令牌技术的方法有很多种今天我为大家分享的令牌技术是 JWT 令牌技术Json Web TokenJWT官网
JWT 组成
JWT 由三个部分组成每部分中间使用点 . 分隔
Header(头部)头部包括令牌的类型(既JWT)及使用的哈希算法Payload(负载)负载部分是存放有效信息的方法里面是一些自定义的内容。此部分不建议存放敏感信息因为此部分可以解码还原原始内容Signature(签名)此部分用于防止JWT内容被篡改确保安全性
注意了签名是为了防止被篡改而不是为了防止被解析JWT之所以安全就是因为最后的签名。JWT令牌当前任何一个字符被篡改整个令牌都会校验失败就好比我们的身份证它的目的不是为了不让别人知道而是保证了我们的身份信息不会被篡改人们很容易看到我们身份证上的信息JWT也是。 当我们修改 Token 之后再对其进行解析的时候就会发现该 Token 无法解析 JWT 令牌的使用
1. 引入 JWT 依赖
首先因为 JWT 令牌属于第三方库所以需要先引入 JWT 依赖
!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api --
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-api/artifactIdversion0.11.5/version
/dependency
!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl --
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-impl/artifactIdversion0.11.5/versionscoperuntime/scope
/dependency
dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-jackson/artifactId !-- or jjwt-gson if Gson is preferred --version0.11.5/versionscoperuntime/scope
/dependency生成 JWT 令牌
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;SpringBootTest
public class JwtUtilTest {//设置令牌的过期时间为30分钟private static final long expiration 1000 * 60 * 30;//密钥private static final String secretString fahfjkshfshdjfhskhfksjdhfjsdjfhsjkdfhs;//生成安全密钥private static final SecretKey KEY Keys.hmacShaKeyFor(Decoders.BASE64URL.decode(secretString));Testpublic static void genJwt() {//自定义信息MapString, Object claim new HashMap();claim.put(id,1);claim.put(username,zhangsan);String jwt Jwts.builder().setClaims(claim) //自定义内容负载.setIssuedAt(new Date()) //设置签证时间.setExpiration(new Date(System.currentTimeMillis() expiration)) //设置过期时间.signWith(KEY) //签名算法.compact();System.out.println(jwt);}public static void main(String[] args) {JwtUtilTest.genJwt();}
}当我们运行这个方法之后就会报下面这个错误原因是我们的密钥的长度太短了并且 idea 建议我们使用 io.jsonwebtoken.security.Keys#secretKeyFor(SignatureAlgorithm)方法来生成一个密钥
java.lang.ExceptionInInitializerError
Caused by: io.jsonwebtoken.security.WeakKeyException: The specified key byte array is 224 bits which is not secure enough for any JWT HMAC-SHA algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used with HMAC-SHA algorithms MUST have a size 256 bits (the key size must be greater than or equal to the hash output size). Consider using the io.jsonwebtoken.security.Keys#secretKeyFor(SignatureAlgorithm) method to create a key guaranteed to be secure enough for your preferred HMAC-SHA algorithm. See https://tools.ietf.org/html/rfc7518#section-3.2 for more information.at io.jsonwebtoken.security.Keys.hmacShaKeyFor(Keys.java:96)at JwtUtilTest.clinit(JwtUtilTest.java:19)
Exception in thread main 所以我们就先使用 idea 建议的方法来生成一个密钥
public static void genKey() {Key key Keys.secretKeyFor(SignatureAlgorithm.HS256);String secretString Encoders.BASE64.encode(key.getEncoded());System.out.println(secretString);
}HS256 代指对应的编码方式 我们运行这个方法获得一个符合规范的密钥 private static final String secretString ZzvPBGOUCmilHmOl6jNmAbusvQryFipKn4VA1yrP7e0;base64编码之后的字符串应该只包含 A-Z, a-z, 0-9, ‘-’ 和 ‘_’ 这些字符。
根据生成的密钥生成 Token eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJ6aGFuZ3NhbiIsImlhdCI6MTcxMDA3NjI0OSwiZXhwIjoxNzEwMDc4MDQ5fQ.PzZoPdXaL2Guc3IZDt2m_-bmaIwu9GzgivTwus36Qno解析 JWT 令牌
当我们使用相应的 API 生成 JWT 之后客户端浏览器将服务器生成的令牌保存在浏览器中下次发送请求的时候就将令牌传给服务器服务器得到之后就需要对这个令牌进行解析。
我们将前面生成的 JWT 放在 JWT 解码网站上进行解析之后就可以得到我们的载荷部分exp表示过期时间 但是可以看到密钥部分是无法解析出来的别人拿不到对应的密钥就无法伪造出 Token。
然后我们看看如何对 Token 进行解析
public static void parseJwt() {String token eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJ6aGFuZ3NhbiIsImlhdCI6MTcxMDA3OTExMSwiZXhwIjoxNzEwMDgwOTExfQ.0_hCtlyhAPoQYnbyCvcKGDGS78YS6jxjNfrFtJ--E9M;Claims claims Jwts.parserBuilder().setSigningKey(secretString).build().parseClaimsJws(token).getBody();System.out.println(claims);
}令牌解析之后我们就可以看到里面的内容如果在解析过程中没有出现报错就说明解析成功了。
解析失败则会出现下面的报错 通过 JWT 令牌技术就可以实现我们生活中的登录功能了。