当前位置: 首页 > news >正文

旅游景区网站建设/网络营销的主要工作有哪些

旅游景区网站建设,网络营销的主要工作有哪些,网站导航怎么用ulli做,wordpress迁移所有页面空白以前一直使用的是jjwt这个JWT库,虽然小巧够用,但对JWT的一些细节封装的不是很好。最近发现了一个更好用的JWT库nimbus-jose-jwt,简单易用,API非常易于理解,对称加密和非对称加密算法都支持,推荐给大家!Spri…

458654781c435498c9c80aaf9bdfd904.png
以前一直使用的是jjwt这个JWT库,虽然小巧够用,但对JWT的一些细节封装的不是很好。最近发现了一个更好用的JWT库nimbus-jose-jwt,简单易用,API非常易于理解,对称加密和非对称加密算法都支持,推荐给大家!

SpringBoot实战电商项目mall(40k+star)地址:https://github.com/macrozheng/mall

简介

nimbus-jose-jwt是最受欢迎的JWT开源库,基于Apache 2.0开源协议,支持所有标准的签名(JWS)和加密(JWE)算法。

JWT概念关系

这里我们需要了解下JWT、JWS、JWE三者之间的关系,其实JWT(JSON Web Token)指的是一种规范,这种规范允许我们使用JWT在两个组织之间传递安全可靠的信息。而JWS(JSON Web Signature)和JWE(JSON Web Encryption)是JWT规范的两种不同实现,我们平时最常使用的实现就是JWS。

使用

接下来我们将介绍下nimbus-jose-jwt库的使用,主要使用对称加密(HMAC)和非对称加密(RSA)两种算法来生成和解析JWT令牌。

对称加密(HMAC)

对称加密指的是使用相同的秘钥来进行加密和解密,如果你的秘钥不想暴露给解密方,考虑使用非对称加密。
  • 要使用nimbus-jose-jwt库,首先在pom.xml添加相关依赖;
<!--JWT解析库-->
<dependency><groupId>com.nimbusds</groupId><artifactId>nimbus-jose-jwt</artifactId><version>8.16</version>
</dependency>
  • 创建JwtTokenServiceImpl作为JWT处理的业务类,添加根据HMAC算法生成和解析JWT令牌的方法,可以发现nimbus-jose-jwt库操作JWT的API非常易于理解;
/*** Created by macro on 2020/6/22.*/
@Service
public class JwtTokenServiceImpl implements JwtTokenService {@Overridepublic String generateTokenByHMAC(String payloadStr, String secret) throws JOSEException {//创建JWS头,设置签名算法和类型JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.HS256).type(JOSEObjectType.JWT).build();//将负载信息封装到Payload中Payload payload = new Payload(payloadStr);//创建JWS对象JWSObject jwsObject = new JWSObject(jwsHeader, payload);//创建HMAC签名器JWSSigner jwsSigner = new MACSigner(secret);//签名jwsObject.sign(jwsSigner);return jwsObject.serialize();}@Overridepublic PayloadDto verifyTokenByHMAC(String token, String secret) throws ParseException, JOSEException {//从token中解析JWS对象JWSObject jwsObject = JWSObject.parse(token);//创建HMAC验证器JWSVerifier jwsVerifier = new MACVerifier(secret);if (!jwsObject.verify(jwsVerifier)) {throw new JwtInvalidException("token签名不合法!");}String payload = jwsObject.getPayload().toString();PayloadDto payloadDto = JSONUtil.toBean(payload, PayloadDto.class);if (payloadDto.getExp() < new Date().getTime()) {throw new JwtExpiredException("token已过期!");}return payloadDto;}
}
  • 创建PayloadDto实体类,用于封装JWT中存储的信息;
/*** Created by macro on 2020/6/22.*/
@Data
@EqualsAndHashCode(callSuper = false)
@Builder
public class PayloadDto {@ApiModelProperty("主题")private String sub;@ApiModelProperty("签发时间")private Long iat;@ApiModelProperty("过期时间")private Long exp;@ApiModelProperty("JWT的ID")private String jti;@ApiModelProperty("用户名称")private String username;@ApiModelProperty("用户拥有的权限")private List<String> authorities;
}
  • JwtTokenServiceImpl类中添加获取默认的PayloadDto的方法,JWT过期时间设置为60s
/*** Created by macro on 2020/6/22.*/
@Service
public class JwtTokenServiceImpl implements JwtTokenService {@Overridepublic PayloadDto getDefaultPayloadDto() {Date now = new Date();Date exp = DateUtil.offsetSecond(now, 60*60);return PayloadDto.builder().sub("macro").iat(now.getTime()).exp(exp.getTime()).jti(UUID.randomUUID().toString()).username("macro").authorities(CollUtil.toList("ADMIN")).build();}
}
  • 创建JwtTokenController类,添加根据HMAC算法生成和解析JWT令牌的接口,由于HMAC算法需要长度至少为32个字节的秘钥,所以我们使用MD5加密下;
/*** JWT令牌管理Controller* Created by macro on 2020/6/22.*/
@Api(tags = "JwtTokenController", description = "JWT令牌管理")
@Controller
@RequestMapping("/token")
public class JwtTokenController {@Autowiredprivate JwtTokenService jwtTokenService;@ApiOperation("使用对称加密(HMAC)算法生成token")@RequestMapping(value = "/hmac/generate", method = RequestMethod.GET)@ResponseBodypublic CommonResult generateTokenByHMAC() {try {PayloadDto payloadDto = jwtTokenService.getDefaultPayloadDto();String token = jwtTokenService.generateTokenByHMAC(JSONUtil.toJsonStr(payloadDto), SecureUtil.md5("test"));return CommonResult.success(token);} catch (JOSEException e) {e.printStackTrace();}return CommonResult.failed();}@ApiOperation("使用对称加密(HMAC)算法验证token")@RequestMapping(value = "/hmac/verify", method = RequestMethod.GET)@ResponseBodypublic CommonResult verifyTokenByHMAC(String token) {try {PayloadDto payloadDto  = jwtTokenService.verifyTokenByHMAC(token, SecureUtil.md5("test"));return CommonResult.success(payloadDto);} catch (ParseException | JOSEException e) {e.printStackTrace();}return CommonResult.failed();}
}
  • 调用使用HMAC算法生成JWT令牌的接口进行测试;

44d7d22233ff1bfdcc27e3c08160b76d.png
  • 调用使用HMAC算法解析JWT令牌的接口进行测试。

b2210d739422cae2386ecb4a15f4e3b9.png

非对称加密(RSA)

非对称加密指的是使用公钥和私钥来进行加密解密操作。对于加密操作,公钥负责加密,私钥负责解密,对于签名操作,私钥负责签名,公钥负责验证。非对称加密在JWT中的使用显然属于签名操作。
  • 如果我们需要使用固定的公钥和私钥来进行签名和验证的话,我们需要生成一个证书文件,这里将使用Java自带的keytool工具来生成jks证书文件,该工具在JDK的bin目录下;

9e93dd4cf5cbe820dfda16105bac4d76.png
  • 打开CMD命令界面,使用如下命令生成证书文件,设置别名为jwt,文件名为jwt.jks
keytool -genkey -alias jwt -keyalg RSA -keystore jwt.jks
  • 输入密码为123456,然后输入各种信息之后就可以生成证书jwt.jks文件了;

4d394af4a2cbd3c9d9085498c9ebac16.png
  • 将证书文件jwt.jks复制到项目的resource目录下,然后需要从证书文件中读取RSAKey,这里我们需要在pom.xml中添加一个Spring Security的RSA依赖;
<!--Spring Security RSA工具类-->
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-rsa</artifactId><version>1.0.7.RELEASE</version>
</dependency>
  • 然后在JwtTokenServiceImpl类中添加方法,从类路径下读取证书文件并转换为RSAKey对象;
/*** Created by macro on 2020/6/22.*/
@Service
public class JwtTokenServiceImpl implements JwtTokenService {@Overridepublic RSAKey getDefaultRSAKey() {//从classpath下获取RSA秘钥对KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "123456".toCharArray());KeyPair keyPair = keyStoreKeyFactory.getKeyPair("jwt", "123456".toCharArray());//获取RSA公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//获取RSA私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();return new RSAKey.Builder(publicKey).privateKey(privateKey).build();}
}
  • 我们可以在JwtTokenController中添加一个接口,用于获取证书中的公钥;
/*** JWT令牌管理Controller* Created by macro on 2020/6/22.*/
@Api(tags = "JwtTokenController", description = "JWT令牌管理")
@Controller
@RequestMapping("/token")
public class JwtTokenController {@Autowiredprivate JwtTokenService jwtTokenService;@ApiOperation("获取非对称加密(RSA)算法公钥")@RequestMapping(value = "/rsa/publicKey", method = RequestMethod.GET)@ResponseBodypublic Object getRSAPublicKey() {RSAKey key = jwtTokenService.getDefaultRSAKey();return new JWKSet(key).toJSONObject();}
}
  • 调用该接口,查看公钥信息,公钥是可以公开访问的;

dc1801effcb332d2639909c9a48066ce.png
  • JwtTokenServiceImpl中添加根据RSA算法生成和解析JWT令牌的方法,可以发现和上面的HMAC算法操作基本一致;
/*** Created by macro on 2020/6/22.*/
@Service
public class JwtTokenServiceImpl implements JwtTokenService {@Overridepublic String generateTokenByRSA(String payloadStr, RSAKey rsaKey) throws JOSEException {//创建JWS头,设置签名算法和类型JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.RS256).type(JOSEObjectType.JWT).build();//将负载信息封装到Payload中Payload payload = new Payload(payloadStr);//创建JWS对象JWSObject jwsObject = new JWSObject(jwsHeader, payload);//创建RSA签名器JWSSigner jwsSigner = new RSASSASigner(rsaKey, true);//签名jwsObject.sign(jwsSigner);return jwsObject.serialize();}@Overridepublic PayloadDto verifyTokenByRSA(String token, RSAKey rsaKey) throws ParseException, JOSEException {//从token中解析JWS对象JWSObject jwsObject = JWSObject.parse(token);RSAKey publicRsaKey = rsaKey.toPublicJWK();//使用RSA公钥创建RSA验证器JWSVerifier jwsVerifier = new RSASSAVerifier(publicRsaKey);if (!jwsObject.verify(jwsVerifier)) {throw new JwtInvalidException("token签名不合法!");}String payload = jwsObject.getPayload().toString();PayloadDto payloadDto = JSONUtil.toBean(payload, PayloadDto.class);if (payloadDto.getExp() < new Date().getTime()) {throw new JwtExpiredException("token已过期!");}return payloadDto;}
}
  • JwtTokenController类,添加根据RSA算法生成和解析JWT令牌的接口,使用默认的RSA钥匙对;
/*** JWT令牌管理Controller* Created by macro on 2020/6/22.*/
@Api(tags = "JwtTokenController", description = "JWT令牌管理")
@Controller
@RequestMapping("/token")
public class JwtTokenController {@Autowiredprivate JwtTokenService jwtTokenService;@ApiOperation("使用非对称加密(RSA)算法生成token")@RequestMapping(value = "/rsa/generate", method = RequestMethod.GET)@ResponseBodypublic CommonResult generateTokenByRSA() {try {PayloadDto payloadDto = jwtTokenService.getDefaultPayloadDto();String token = jwtTokenService.generateTokenByRSA(JSONUtil.toJsonStr(payloadDto),jwtTokenService.getDefaultRSAKey());return CommonResult.success(token);} catch (JOSEException e) {e.printStackTrace();}return CommonResult.failed();}@ApiOperation("使用非对称加密(RSA)算法验证token")@RequestMapping(value = "/rsa/verify", method = RequestMethod.GET)@ResponseBodypublic CommonResult verifyTokenByRSA(String token) {try {PayloadDto payloadDto  = jwtTokenService.verifyTokenByRSA(token, jwtTokenService.getDefaultRSAKey());return CommonResult.success(payloadDto);} catch (ParseException | JOSEException e) {e.printStackTrace();}return CommonResult.failed();}
}
  • 调用使用RSA算法生成JWT令牌的接口进行测试;

920e8e37aabb5cdd61e0ad82e902b662.png
  • 调用使用RSA算法解析JWT令牌的接口进行测试。

303ad1895b9ccaee6bf4ca1cfdf9df26.png

参考资料

官方文档:https://connect2id.com/products/nimbus-jose-jwt

项目源码地址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-jwt

本文 GitHub https://github.com/macrozheng/mall-learning已经收录,欢迎大家Star。
http://www.lbrq.cn/news/1541071.html

相关文章:

  • 学做网站学什么语言/百度浏览器手机版
  • 网站图片自动切换怎么做/合肥网站关键词优化公司
  • hao1123网址之家/seo网络优化师
  • 手机网站视频播放模板/郑州网络推广厂家
  • 肥城网站制作/被公司优化掉是什么意思
  • 叫别人做网站需要注意什么问题/宁波免费seo排名优化
  • 腾讯云域名如何建设网站/中国制造网
  • 秋林 做网站/关键词优化流程
  • 手机做网站/域名查询官网
  • 银联支付网站建设/seo网络优化前景怎么样
  • 济南品牌网站建设定制/上海百度首页优化
  • 现在流行用什么做网站/seo刷关键词排名优化
  • 公司怎么注册网站免费/seo商城
  • 扬州市规划建设局网站/淘宝seo是什么意思
  • 深圳公司设计网站/客服外包平台
  • 网络公司做网站后交代给客户什么/品牌策划公司
  • 生鲜网站制作/成都百度推广公司电话
  • 辽宁响应式网站费用/seo挖关键词
  • 全市网站建设情况摸底调查/百度账号怎么注册
  • 成都高端网站设计公司/百度竞价排名模式
  • 公司建了网站怎么做分录/站长之家ip查询
  • 搜索引擎优化培训免费咨询/专业搜索引擎seo技术公司
  • 日本做的视频网站/2022年最火的关键词
  • 国外做外贸的小网站/世界军事新闻
  • wpf入可以做网站吗/百度排行榜明星
  • 猫咪网页链接/长春网站seo
  • 保健品网站源码/产品推广方案范例
  • 为中国移动做网站的公司叫什么/站长素材音效下载
  • 网站横幅广告怎么做/旅游新闻热点
  • 建设代刷网站/拼多多推广引流软件免费
  • Spring事务源码
  • RocketMq消费者动态订阅topic
  • Linux 中断机制深度分析
  • C++算法竞赛:位运算
  • 基于DSP+ARM+FPGA架构的储能协调控制器解决方案,支持全国产化
  • Node.js导入MongoDB具体操作