首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot项目集成【用户身份认证】实战 【实战核心篇】基于JWT生成和校验Token

SpringBoot项目集成【用户身份认证】实战 【实战核心篇】基于JWT生成和校验Token

作者头像
天罡gg
修改于 2023-04-02 07:49:18
修改于 2023-04-02 07:49:18
1.3K01
代码可运行
举报
文章被收录于专栏:天罡gg天罡gg
运行总次数:1
代码可运行

前言

书接上文 技术选型篇,我们做了【用户身份认证】的技术选型说明,对基于Session、Token、JWT的方案进行了详细的对比分析,详细说明了它们都是什么和各自的优缺点!这些是实战的基础,还没看过的同学,建议先看上文。最终我和狗哥(博客主页) 采用的是目前流行的基于JWT的Token用户身份认证机制!

本文是实战核心篇,重点是把JWT的核心代码实现! 基于上文我们分析的【用户身份认证】的流程(如下图),我们可以确定使用JWT的核心是实现两点:生成Token、校验Token! 接下来我们就来实现它!

PS,完整的用户身份认证代码早已实现,和狗哥也已联调通过,正在赶工博文,预告一下我将分三篇来写,非常详细,料很足,准备好发车喽,Let’s go!

  • 【技术选型篇】基于Session、Token、JWT怎么选? 【上文-已发布】
  • 【实战核心篇】基于JWT生成和校验Token【本文】
  • 【实战全流程篇】基于JWT+双重检查的登录+登出+拦截器 --防XSS+CSRF漏洞【下文】

本文目录


专栏介绍

因为可能还有很多同学还不清楚上下文,所以简单介绍一下这个专栏要做的事:

天罡老哥和狗哥(博客主页)有意从0到1带大家搭建一个SpringBoot+SpringCloud+Vue的前后端分离项目! 打造一个短小精悍、技术主流、架构规范的前后端分离实战项目!我负责后端,狗哥负责前端! 目的就是让大家通过项目实战,学到一些真东西,将所学理论落地,助力有心强大的你更快的成长!开启你的工作之旅,让开发游刃有余!

详细的后端规划后端大纲思维导图在开篇已经给出,你可以到开篇查收:基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇


一、引入依赖

官方推荐Java的JWT开源库中,收藏数最高的是:java-jwtjjwt-root

我们选择使用java-jwt库,项目中将认证相关的通用实现会封装到common层!提前展示一下目录结构,方便大家对照实战:

pom中引入依赖,版本号依然定义在父pom定义!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.11.0</version>
</dependency>

二、TokenProvider 接口

令牌的提供者接口。

从用户身份认证对Token的应用场景来看,核心实现就两个方法:创建Token校验Token

所以,这里提取一个接口TokenProvider,虽然目前只有JWT一种实现,但JWT实际上也只是Token中的一种,所以,以后想用其它Token,只要实现TokenProvider接口,就可以平滑的切过去。

符合开闭原则:对扩展开放,对修改关闭!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface TokenProvider {

    /**
     * 根据用户授权信息,创建token
     */
    String create(AuthContextInfo authContextInfo);

    /**
     * 校验token,解析出用户授权信息
     */
    AuthContextInfo verify(String token) ;
}

AuthContextInfo里保存的是认证信息,包含两个重要字段(也就是要存入Payload中的信息):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private String userId;
private String userName;

三、JwtTokenProvider 实现类

基于JWT实现的令牌提供者,快速预览说明如下:

从上图可以看出,除了两个核心方法,还定义了两个Payload相关的常量,不过这不是重点。

重点是红框处的【将依赖由构造函数传入】,说明一下为什么这么做!

JWT的签名算法(JwtAlgorithm)和 过期时间(expire)都是变化点,根据依赖倒置原则,要依赖抽象接口,不依赖具体实现,所以我们将它交给外部传入!

另外,在common层实现的类,对变化点应不做决定,而是交给上层决定将依赖注入。

1. 创建Token方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public String create(AuthContextInfo authContextInfo) {
    Date issuedAt = new Date();

    Calendar expiresAt  = Calendar.getInstance();
    expiresAt.add(Calendar.SECOND, expire);

    return JWT.create()
        // 签发者
        .withIssuer(authContextInfo.getUserId())
        // 主题
        .withSubject(SUBJECT)
        // 签发时间
        .withIssuedAt(issuedAt)
        // 过期时间
        .withExpiresAt(expiresAt.getTime())
        // 在签发时间之前不可用
        .withNotBefore(issuedAt)
        // 自定义 userName
        .withClaim(CLAIM_USERNAME, authContextInfo.getUserName())
        .sign(this.jwtAlgorithm.getAlgorithm());
}
  • with开头的方法都是构建payload字段信息,withClaim是构建自定义字段,可以构建多个自定义字段!
  • sign方法是指定签名算法 这里不依赖具体算法,而是依赖JwtAlgorithm接口!说完校验token再具体说 JwtAlgorithm。

2. 校验Token方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public AuthContextInfo verify(String token) {
    DecodedJWT decodedJWT;
    try {
        // 校验token,无效或过期会抛异常
        decodedJWT = this.jwtAlgorithm.getJwtVerifier().verify(token);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    // 主题不一致,被修改了
    if (!SUBJECT.equals(decodedJWT.getSubject())) {
        return null;
    }
    // 返回userId和userName
    AuthContextInfo authInfo = new AuthContextInfo();
    authInfo.setUserId(decodedJWT.getIssuer());
    authInfo.setUserName(decodedJWT.getClaim(CLAIM_USERNAME).asString());
    return authInfo;
}
  • verify方法不报错,说明token合法且未过期,解析的decodedJWT对象里面包含了我们创建时存储的payload载荷信息(也就是数据)。

3. JwtAlgorithm接口

JwtAlgorithm接口是 JwtTokenProvider 的重要依赖,主要包括获取【签名算法】和【验证方法】,定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface JwtAlgorithm {

    /**
     * 获取JWT使用的算法
     */
    Algorithm getAlgorithm();

    /**
     * 获取JWT使用的验证方法
     */
    JWTVerifier getJwtVerifier();
}

3.1 RSA算法实现

对应的是RSA算法的实现类JwtRsaAlgorithm,这里的公钥(publicKey)和私钥(privateKey)也是通过构造函数由外部指定,也是将依赖倒置!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JwtRsaAlgorithm implements JwtAlgorithm {

    private final Algorithm algorithm;
    private final JWTVerifier jwtVerifier;
    @Override
    public Algorithm getAlgorithm() {
        return algorithm;
    }
    @Override
    public JWTVerifier getJwtVerifier() {
        return jwtVerifier;
    }

    /**
     * 有参构造函数,将依赖倒置
     */
    public JwtRsaAlgorithm(String publicKey, String privateKey) {
        // 获取公钥对象
        RSAPublicKey rsaPublicKey;
        try {
            rsaPublicKey = RsaKeyUtils.getPublicKey(publicKey);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Get RSA public key error!", e);
        }
        // 获取私钥对象
        RSAPrivateKey rsaPrivateKey;
        try {
            rsaPrivateKey = RsaKeyUtils.getPrivateKey(privateKey);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Get RSA public key error!", e);
        }
        // 创建RSA256签名算法
        this.algorithm = Algorithm.RSA256(rsaPublicKey, rsaPrivateKey);
        // 构建JWTVerifier对象
        this.jwtVerifier = JWT.require(this.algorithm)
                .acceptLeeway(10)
                .acceptExpiresAt(5)
                .build();;
    }
}
  • 代码中的像Algorithm.RSA256JWT.require都是开源库提供的,用于生成最终的AlgorithmJWTVerifier;
  • RsaKeyUtils 是我们定义的通用的工具类,用于将base64编码的 公钥(publicKey)和私钥(privateKey)转为对应的Key对象,直接拷贝使用即可。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class RsaKeyUtils {
    public static RSAPublicKey getPublicKey(String base64String) throws NoSuchAlgorithmException, InvalidKeySpecException {
        byte[] b = Base64.getDecoder().decode(base64String);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(b);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Key key = keyFactory.generatePublic(keySpec);
        return (RSAPublicKey) key;
    }

    public static RSAPrivateKey getPrivateKey(String base64String) throws NoSuchAlgorithmException, InvalidKeySpecException {
        byte[] b = Base64.getDecoder().decode(base64String);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(b);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        Key key = keyFactory.generatePrivate(keySpec);
        return (RSAPrivateKey)key;
    }
}

3.2 HMAC算法实现

支持的算法很多,我们再扩展JwtAlgorithm接口,实现一下HMAC算法,你可以实现你需要的算法!

对应的是HMAC算法的实现类JwtHmacAlgorithm,这里的秘钥(secret)也是通过构造函数由外部指定,也是将依赖倒置!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class JwtHmacAlgorithm  implements JwtAlgorithm {

    private final Algorithm algorithm;
    private final JWTVerifier jwtVerifier;

    @Override
    public Algorithm getAlgorithm() {
        return algorithm;
    }
    @Override
    public JWTVerifier getJwtVerifier() {
        return jwtVerifier;
    }

    /**
     * 有参构造函数,将依赖倒置
     */
    public JwtHmacAlgorithm(String secret) {
        // 创建HMAC256签名算法
        this.algorithm = Algorithm.HMAC256(secret);
        // 构建JWTVerifier对象
        this.jwtVerifier = JWT.require(this.algorithm)
                .acceptLeeway(10)
                .acceptExpiresAt(5)
                .build();
    }
}
  • 使用Algorithm.HMAC256生成算法,再根据Algorithm生成JWTVerifier;

四、测试

因为我们写的类不依赖Spring容器,所以直接在JwtTokenProvider里写个main方法就可以测试,这里使用RSA算法测试,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) throws InterruptedException {
    String publicKey = "太长,省略,可以到 http://www.metools.info/code/c80.html 自行生成。。。";
    String privateKey = "太长,省略,可以到 http://www.metools.info/code/c80.html 自行生成。。。";
    // 创建RSA算法
    JwtAlgorithm jwtRsaAlgorithm = new JwtRsaAlgorithm(publicKey, privateKey);
    // 创建JWT提供者:10秒过期 + RSA算法
    TokenProvider jwtTokenProvider = new JwtTokenProvider(10, jwtRsaAlgorithm);
    // 测试保存到Token中的授权信息
    AuthContextInfo authContextInfo = new AuthContextInfo();
    authContextInfo.setUserId("123456");
    authContextInfo.setUserName("admin");
    // 创建token
    String token = jwtTokenProvider.create(authContextInfo);
    System.out.println("token:" + token);
    // 循环校验token何时过期
    while (true) {
        Thread.sleep(2000);
        // 校验token
        AuthContextInfo authInfo = jwtTokenProvider.verify(token);
        if (authInfo == null) {
            break;
        }
        System.out.println("校验ok:" + authInfo.toString());
    }
}

上面的测试代码,既包括了【创建Token】方法,也包括了【校验Token】方法,主逻辑如下:

  • 创建jwtTokenProvider:基于RSA算法的jwtRsaAlgorithm
  • 创建1个只有10秒有效的Token:jwtTokenProvider.create
  • 循环校验Token是否过期:jwtTokenProvider.verify 返回null就过期了

测试结果,刚好10秒过期!


五、Web层配置注入

在SpringBoot中,我们通常将类交给Spring管理,首先复习一下之前讲过的常用的组件注解:

  • @Service: 通常放在service层的服务类上
  • @Repository: 通常放在dal层的数据访问类上
  • @Controller: 通常放在web层控制器的类上
  • @Component: 代表通用的组件,从它派生了上面3个注解,用于各个实际的场景.

打上这些注解的类,在Spring中称之为Bean。

本文,我们将学习一种新的IOC注入方式:通过JavaConfig的方式注入Bean,即在类上加@Configuration注解,代表这是一个配置类,里面通过添加@Bean注解注入Bean对象,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class AuthConfig {

    @Bean
    public JwtAlgorithm jwtRsaAlgorithm(@Value("${auth.jwt.rsa.publicKey}") String publicKey, @Value("${auth.jwt.rsa.privateKey}") String privateKey ) {
        return new JwtRsaAlgorithm(publicKey, privateKey);
    }

    @Bean
    public TokenProvider jwtTokenProvider(@Value("${auth.jwt.expire}") int expire, JwtAlgorithm jwtAlgorithm) {
        return new JwtTokenProvider(expire, jwtAlgorithm);
    }
}

通过以上方式,我们就向Spring的IOC容器注入了TokenProvider、JwtAlgorithm,这样我们就可以通过@Autowired注解直接使用了!以后如果想将切换算法,只需要修改这里的配置类,而不用去修改已实现的RSA算法类。

这里还有一个知识点:@Value注解,用于读取配置文件(application.properties或application.yml)中读取字段的值,格式:@Value(“$配置字段名”),这里是用在方法参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Value("${auth.jwt.expire}") int expire
 代表:expire = 配置文件中auth.jwt.expire的值

这里到了3个@Value,对应application.properties中的3个配置如下(以\换行):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
auth.jwt.expire =300

auth.jwt.rsa.publicKey=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArK+NOK/89rNAWeAguHti\
91QpMaHDZ6EaaySu5dyEvw6oUs4t8AiEc6HC7iTl1U2fxvuukk6P3e96V5w+fb+S\
UFUUaO+oocsKOOxwXcfJ1uQorMsEns1PjYB9weOOYYQoE2KY34AE6+zRT3w8uMXX\
pBmazZbPhUP8cGAOimUv4nSIK4n/nwBezEEeFM5dREaxabiDBe9HvOXmu8EfO2/P\
MsE5K9x/GP/wNbE+yzP+rC6rr3mgJNugUmE7BB1Usl7pS1myukiFz+PXoE/nibed\
k5FWzL5jeV8M8F7AZ404DdVhyN5dbLvwAI8jnnJ1nNRVEh5+1H0rvwSSlTAo+Po+\
bwIDAQAB

auth.jwt.rsa.privateKey=MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCsr404r/z2s0BZ\
4CC4e2L3VCkxocNnoRprJK7l3IS/DqhSzi3wCIRzocLuJOXVTZ/G+66STo/d73pX\
nD59v5JQVRRo76ihywo47HBdx8nW5CisywSezU+NgH3B445hhCgTYpjfgATr7NFP\
fDy4xdekGZrNls+FQ/xwYA6KZS/idIgrif+fAF7MQR4Uzl1ERrFpuIMF70e85ea7\
wR87b88ywTkr3H8Y//A1sT7LM/6sLquveaAk26BSYTsEHVSyXulLWbK6SIXP49eg\
T+eJt52TkVbMvmN5XwzwXsBnjTgN1WHI3l1su/AAjyOecnWc1FUSHn7UfSu/BJKV\
MCj4+j5vAgMBAAECggEBAJ9/djzJsChc4C8jKJW8wWgYQAQrmUR6NOCJfVGqIKIn\
c6kn7p4p/8yduGIlinM9wzoS9OcF0TP4IVQSaFXVP9sa+kMCOQtXchWprQ+xnOfy\
zO7shVP35maYK4+OEtBXNHzTMMgegm02yw1TfvJbKhXT4HvLs9kvNlbFIikJ1PSf\
kRdruq8/SiqDAiwtN4OUn7X3/pIx6b9P7hbO95aNUi1Dxb8xjQA05QVlqA8OwNyq\
ORUHI0ayZI6dmyTA5FUkZZf1tS0PzVLjubBOjZHRSq1a8Eg2qV+e/zDNPkuKQZ3g\
jyy6PamkRlSbfel6+8zacQVC8QRe1AAX68HFe/WKz2ECgYEA2WZySOPBJF85KuK1\
Tv8rgNAoRZZNZbH/0YT2OkBOprOX7bOtvSx+nTZPw0U7nR3nMqnJ9uk/gVfmkbD6\
WzHaSNEpxim2lT+A9jMC5FZcaQxJDHHBpUdMbPssvPGkE8i0XY+rxyQCugVp7+Jg\
mTHISfaZCSBmAG09qtp3Wuk8li0CgYEAy1iv53kChnVvBTckQYHWI5R5ByzPOEum\
EHLo8fvEvUSWaVlDDoPeFw1XtybNVBeyeu/c3HLi7/Z1836PwtpCCAF9XSIq8N/B\
PUR2hKDlg4j3m6BvR25Pu54ORbyevL1LugV+iGVfQ9lWjeV6XeYoN/jGTwSY/Hb+\
dc4rur8sBIsCgYBYlFx2hI460q3JYow7fs7r8mSmTeKFUCyK4yEshO1HESATU0W0\
Mb/5MJr5Vmk+0GNWikXnXAxrGDSzIigwJjTpvIfH3VEuqKxUJF7GSMXoa4AMGQGs\
5UsnkIQfDFotUXbkNFjqkCqoPvJ2Mofng5g3QsoCJPhKrjgVOGSvXx83lQKBgQCG\
0Y8WveFRumxYHd4Y3HdYcajoe+oLngRFJZqSTWV8QwwiXr8Z0Y4e5IbCdKRv26JG\
5d8d/cG+bT54qPGxs7lRy4MNi4jC2OcqssiNWIuy8M2RzgXZaybL8pft3oe0BSE+\
/UOONP+7YU6El5/Qv7bsnTEF1LuFr3M4MfBGSVdqzwKBgQDJBulXrWWQujQlQ+9/\
u7YoCwIr6N/ZL0fpnKtaQ7WfHs7zy6QUhu6skufFJKmWehOD6i+SWBmuhv4PPMCS\
IPhjChIh8AL8AVfSCjrksP0YENOHtbBhSE9bBHdH4u9VBy+6lbErSLl0867Qy4Z4\
LAN0Bjc+5MNy0vMQmqat/EKlHA==

web层对应的目录结构:


最后

OK,就说这么多了,我们下文见!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JWT(java web token)
tomcat session活化技术,关闭后会把session序列化存储本地文件,启动时加载
P轴
2022/11/18
9160
JWT详解「建议收藏」
这种基于token的认证方式相比传统的session认证方式更节约服务器资源,并且对移动端和分布式更加友好。其优点如下:
全栈程序员站长
2022/08/25
1.7K0
JWT详解「建议收藏」
如何生成腾讯会议SDK鉴权所需的SDK Token和ID Token等信息
在开通SDK配置之后,会从腾讯侧获取到SDK接入所需的对接参数。与Token生成相关的具体参数及用途如下:
liquid
2023/07/20
3.7K6
区块链基础:非对称算法
1.Hash算法 package cn.hadron.security; import java.security.MessageDigest; import java.util.UUID; import org.eclipse.jetty.util.security.Credential.MD5; /** * crypto['krɪptoʊ]秘密成员, * 一些语言的crypto模块的目的是为了提供通用的加密和哈希算法 * 加密工具类 */ public class CryptoUtil
程裕强
2022/05/06
4340
区块链基础:非对称算法
JAVA非对称加密算法-RSA算法
这篇文章上次修改于 255 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 一、概述 RSA是基于大数因子分解难题。目前各种主流计算机语言都支持RSA算法的实现 java6支持RSA算法 RSA算法可以用于数据加密和数字签名 RSA算法相对于DES/AES等对称加密算法,他的速度要慢的多 总原则:公钥加密,私钥解密 / 私钥加密,公钥解密 二、模型分析 RSA算法构建密钥对简单的很,这里我们还是以甲乙双方发送数据为模型 甲方在本地构建密钥对(公钥+私钥),并将公钥公布给乙方 甲方将数据用私钥进
Erwin
2019/12/31
3.8K0
如何使用 RSA 加密 JWT
因为使用 openssl 生成的密钥是 pkcs1格式的密钥,java默认只能使用 pkcs8 格式的密钥,所以需要进行pkcs1到pkcs8转换的转换
BUG弄潮儿
2022/12/05
1.4K0
说一下你常用的加密算法
加密算法我们整体可以分为:可逆加密和不可逆加密,可逆加密又可以分为:对称加密和非对称加密。
Java旅途
2020/07/23
1.9K0
srpingboot接口数据加密(参数和返回结果)
1、我这里使用的是rsa进行的加密解密。由于springboot中的rsa-encrypt-body-spring-boot 这个限制比较大。所有这里我们使用实现接口方法自定义加密解密。
高大北
2022/12/18
2K1
srpingboot接口数据加密(参数和返回结果)
RSA非对称加密
需要注意的一点,这个公钥和私钥必须是一对的,如果用公钥对数据进行加密,那么只有使用对应的私钥才能解密,所以只要私钥不泄露,那么我们的数据就是安全的。
会跳舞的机器人
2018/09/03
1.7K0
请看,常见的加密算法及详解都在这里!
加密算法,是现在每个软件项目里必须用到的内容。广泛应用在包括了用户登入、数字签名、数据传输等多个场合。那大家都知道那些呢?今天我把常见的加密算法全部整理在这里,供大家学习参考。
攻城狮的那点事
2019/12/10
1.6K0
RSA加密算法的java实现
实现基本上就是这样,都是大同小异。不过,问题来了,结下来才是重点。 **1. RSA加密算法对于加密数据的长度是有要求的。一般来说,明文长度小于等于密钥长度(Bytes)-11。解决这个问题需要对较长的明文进行分段加解密,这个上面的代码已经实现了。 2. 一旦涉及到双方开发,语言又不相同,不能够采用同一个工具的时候,切记要约定以下内容。 a)约定双方的BASE64编码 b)约定双方分段加解密的方式。我踩的坑也主要是这里,不仅仅是约定大家分段的大小,更重要的是分段加密后的拼装方式。doFinal方法加密完成后得到的仍然是byte[],因为最终呈现的是编码后的字符串,所以你可以分段加密,分段编码和分段加密,一次编码两种方式(上面的代码采用的是后一种,也推荐采用这一种)。相信我不是所有人的脑回路都一样的,尤其是当他采用的开发语言和你不通时。**
全栈程序员站长
2022/08/14
1.2K0
SpringBoot 实现 RAS+AES 自动接口解密
目前常用的加密方式就对称性加密和非对称性加密,加密解密的操作的肯定是大家知道的,最重要的使用什么加密解密方式,制定什么样的加密策略;考虑到我技术水平和接口的速度,采用的是RAS非对称加密和AES对称加密一起用!!!!
程序员蜗牛
2024/05/10
3330
SpringBoot 实现 RAS+AES 自动接口解密
springboot整合RSA进行sign签名校验
1.RSA工具代码 package com.unwulian.common.sign; /* --------------------------------------------**********-------------------------------------------- 该算法于1977年由美国麻省理工学院MIT(Massachusetts Institute of Technology)的Ronal Rivest,Adi Shamir和Len Adleman三位年轻教授提出,并
用户5927264
2020/07/27
2.3K0
java加密解密
1 package com.jetsum.util; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.security.InvalidAlgorithmParameterException; 7 import java.security.InvalidKeyException
landv
2018/05/24
7.2K0
RSA 加解密 1024 位 & 2048 位
RSA 算法是一种非对称加密算法,会生成一对 RSA 秘钥,即公钥+私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,接口根据私钥进行解密
BUG弄潮儿
2022/06/30
3.3K0
RSA 加解密 1024 位 & 2048 位
RAS非对称加解密-RAS加解密和签名和验签,密钥生成器(java代码)
RAS非对称加解密-RAS加解密和签名和验签,密钥生成器(java代码) RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥,即公钥 + 私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,服务方根据私钥进行解密。
oktokeep
2024/10/09
2290
JWT & SpringBoot & 授权
JSON WEB TOKEN,它定义了一种紧凑且自包含的方式,用于将信息作为 JSON 对象安全地在各方之间传输信息。此信息可以验证和信任,因为它是数字签名。JWT 可以使用密钥(使用HMAC算法)或使用 RSA 或 ECDSA 进行公钥/私钥对进行签名。
收心
2022/01/17
1.6K0
JWT & SpringBoot & 授权
Android传输数据时加密详解
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4
全栈程序员站长
2022/08/30
1.4K0
Android传输数据时加密详解
Spring Cloud 学习笔记(6) gateway 结合 JWT 实现身份认证
Spring cloud gateway 是一个api网关,可以作为 api 接口的统一入口点。实际使用过程中往往需要 对 一个 URL 进行身份认证,比如必须携带token令牌才能访问具体的URL等,这个过程可以统一在 gateway 网关实现。
张云飞Vir
2021/05/18
4.6K0
Spring Cloud 学习笔记(6) gateway 结合 JWT 实现身份认证
Java使用RSA加密解密签名及校验
再来一个Base64的类,当然你也可以用commons-codec-1.9.jar
全栈程序员站长
2021/04/13
4.6K0
Java使用RSA加密解密签名及校验
相关推荐
JWT(java web token)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档