jwt学习

jwt基础

JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性。Token里可以包含所有必要的信息,这样服务端就无需保存任何关于用户或会话的信息了。JWT可用于身份认证,会话状态维持以及信息交换等任务。

JSON Web 令牌结构

JSON Web令牌以紧凑的形式由三部分组成,这些部分由点(.)分隔,分别是:

头部(Header)
有效载荷(Payload)
签名(Signature)

头部(Header)

头部用于描述关于该JWT的最基本的信息,通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法。例如:

{
"alg": "HS256",
"typ": "JWT"
}

ctfshow-web345(jwt密钥爆破)

使用工具:https://github.com/ticarpi/jwt_tool

从cookie中找到jwt

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYzMTA4MTk4NSwiZXhwIjoxNjMxMDg5MTg1LCJuYmYiOjE2MzEwODE5ODUsInN1YiI6InVzZXIiLCJqdGkiOiIzZTc2YTUzNzIxZmFjMmEyYzVlY2I3NjJkZDUxMGNmYSJ9.ccX7cCWIBSu5ZpAiW6CuZk-o1Rhpy1i8K6LQVZ6mU4Y

发现采用HS256对称加密
在这里插入图片描述
使用jwt_tool进行秘钥爆破,结果为123456

# 使用手册
https://blog.csdn.net/qq_23936389/article/details/103451888

# 尝试破解密钥(HMAC算法)例如HS256 / HS384 / HS512
python3 jwt_tool.py <jwt值> -C -d <字典>
python3 jwt_tool.py "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYzMTA4MTk4NSwiZXhwIjoxNjMxMDg5MTg1LCJuYmYiOjE2MzEwODE5ODUsInN1YiI6InVzZXIiLCJqdGkiOiIzZTc2YTUzNzIxZmFjMmEyYzVlY2I3NjJkZDUxMGNmYSJ9.ccX7cCWIBSu5ZpAiW6CuZk-o1Rhpy1i8K6LQVZ6mU4Y" -C -d 10_million_password_list_top_100000.txt
# 在-d dictionary.txt参数旁边使用jwt_tool的-C标志来尝试针对字典文件中的所有单词验证密钥

在这里插入图片描述

ctfshow-web348

这里用字典没爆破出来,使用c-jwt-cracker爆破出来了

地址:https://github.com/brendan-rius/c-jwt-cracker

# kali安装
apt-get install libssl-dev
make

# 使用
./jwtcrack "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYzMTA4MzYwMywiZXhwIjoxNjMxMDkwODAzLCJuYmYiOjE2MzEwODM2MDMsInN1YiI6InVzZXIiLCJqdGkiOiI3ZGVlYmEyY2JkNjY1Zjg0NGQxZWFhZGQwMTMwZjZmZSJ9.WF2B5xtyepFKIlVbeABuYi2Fmd7hZI-_pOEPJUj7Nik"

在这里插入图片描述
或者使用hashcat暴力破解也可以

hashcat -m 16500 jwt.txt -a 3 -w 3 ?l?l?l?l

在这里插入图片描述

使用hashcat爆破

除此之外,我们也可以用hashcat来爆破,使用教程https://blog.csdn.net/smli_ng/article/details/106111493

直接使用规则爆破

hashcat -a 0 -m 16500 jwt_token jwt_key.txt -r rules/d3ad0ne.rule --force
	-m, --hash-type		指定哈希类型
	-a, --attack-mode	指定破解模式
	-w, --workload-profile

暴力破解

hashcat -m 16500 jwt.txt -a 3 -w 3 ?a?a?a?a?a?a

hashcat破解模式介绍

0    straight                                字典破解
1    combination                             将字典中密码进行组合(1 2 ——> 11 22 12 213    brute-force                             使用指定掩码破解
6    Hybrid Wordlist + Mask                  字典+掩码破解
7    Hybrid Mask  + Wordlist                 掩码+字典破解

hashcat集成的字符集

?l                代表小写字母
?u              代表大写字母
?d              代表数字
?s              代表特殊字符
?a              代表大小写字母、数字以及特殊字符  
?b               0x00-0xff 

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shiro可以与JWT(JSON Web Token)结合使用来实现认证和授权功能。具体步骤如下: 1.编写JWT工具类,用于生成和验证JWT token。 2.编写JWTToken,继承Shiro的AuthenticationToken接口,用于封装JWT token。 3.编写JWTFilter,继承Shiro的AuthenticatingFilter类,用于在请求中验证JWT token。 4.编写JWTRealm,继承Shiro的AuthorizingRealm类,用于从JWT token中获取用户信息并进行授权。 5.编写Shiro配置类,配置JWTFilter和JWTRealm。 下面是一个简单的示例代码: ```java // JWT工具类 public class JWTUtil { // 生成JWT token public static String createToken(String username, String secret) { Date now = new Date(); Date expireDate = new Date(now.getTime() + 3600 * 1000); // 过期时间为1小时 return Jwts.builder() .setSubject(username) .setIssuedAt(now) .setExpiration(expireDate) .signWith(SignatureAlgorithm.HS256, secret) .compact(); } // 验证JWT token public static boolean verifyToken(String token, String username, String secret) { try { Claims claims = Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); return claims.getSubject().equals(username) && !claims.getExpiration().before(new Date()); } catch (Exception e) { return false; } } } // JWTToken public class JWTToken implements AuthenticationToken { private String token; public JWTToken(String token) { this.token = token; } @Override public Object getPrincipal() { return token; } @Override public Object getCredentials() { return token; } } // JWTFilter public class JWTFilter extends AuthenticatingFilter { @Override protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception { String token = getRequestToken((HttpServletRequest) request); if (StringUtils.isBlank(token)) { return null; } return new JWTToken(token); } @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { String token = getRequestToken((HttpServletRequest) request); if (StringUtils.isBlank(token)) { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); httpResponse.setHeader("Access-Control-Allow-Origin", ((HttpServletRequest) request).getHeader("Origin")); httpResponse.setCharacterEncoding("UTF-8"); httpResponse.setContentType("application/json"); httpResponse.getWriter().print("{\"code\":401,\"msg\":\"未登录\"}"); return false; } return executeLogin(request, response); } private String getRequestToken(HttpServletRequest request) { String token = request.getHeader("Authorization"); if (StringUtils.isBlank(token)) { token = request.getParameter("token"); } return token; } } // JWTRealm public class JWTRealm extends AuthorizingRealm { @Override public boolean supports(AuthenticationToken token) { return token instanceof JWTToken; } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = JWTUtil.getUsername(principals.toString()); // 根据用户名获取用户角色和权限信息 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.setRoles(user.getRoles()); info.setStringPermissions(user.getPermissions()); return info; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException { String token = (String) auth.getCredentials(); String username = JWTUtil.getUsername(token); // 根据用户名获取用户信息 if (user == null) { throw new UnknownAccountException("用户不存在"); } if (!JWTUtil.verify(token, username, user.getPassword())) { throw new IncorrectCredentialsException("token无效"); } return new SimpleAuthenticationInfo(token, token, "jwtRealm"); } } // Shiro配置类 @Configuration public class ShiroConfig { @Bean public JWTFilter jwtFilter() { return new JWTFilter(); } @Bean public JWTRealm jwtRealm() { return new JWTRealm(); } @Bean public DefaultWebSecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(jwtRealm()); return securityManager; } @Bean public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager, JWTFilter jwtFilter) { ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); shiroFilter.setSecurityManager(securityManager); Map<String, Filter> filters = new HashMap<>(); filters.put("jwt", jwtFilter); shiroFilter.setFilters(filters); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/**", "jwt"); shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilter; } } // 异常处理类 @RestControllerAdvice public class ExceptionHandler { @ExceptionHandler(UnknownAccountException.class) public Result handleUnknownAccountException(UnknownAccountException e) { return Result.error("用户不存在"); } @ExceptionHandler(IncorrectCredentialsException.class) public Result handleIncorrectCredentialsException(IncorrectCredentialsException e) { return Result.error("密码错误"); } @ExceptionHandler(AuthenticationException.class) public Result handleAuthenticationException(AuthenticationException e) { return Result.error("认证失败"); } @ExceptionHandler(Exception.class) public Result handleException(Exception e) { return Result.error("系统异常"); } } // Controller @RestController public class UserController { @PostMapping("/login") public Result login(String username, String password) { // 根据用户名和密码验证用户信息 String token = JWTUtil.createToken(username, password); return Result.success(token); } @GetMapping("/user") public Result getUser() { // 获取当前用户信息 return Result.success(user); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值