JWT,以及与JWS和JWE之间的关系
简而言之,JWT是一种安全规范,主要用于在双方之间传递安全数据。而JWS和JWE是实现安全传输的两种方式,JWS用于对传输报文的签名与验签,JWE用于对敏感数据的加密解密。
JWS
官方文档直通车:JWS文档
JWS由三部分组成,header,payload和sign
header主要包含alg:标识用的什么算法加密。
crit:包括header里除了文档里规定字段之外的其他字段。
其他的字段,可视情况而定。
example

{"alg": "RS256","kid": "201909031543","crit": ["UPI-UUID", "UPI-TIMESTAMP", "UPI-APPID", "UPI-REQPATH"],"UPI-UUID": "07d2d-dfaa-412e-88e0-75d038b98237","UPI-TIMESTAMP": "1568263226","UPI-APPID": "M0050001","UPI-REQPATH": "/getInfo"
}

payload,这里可以放非加密数据的报文也可以放官方文档里要求的字段,我在实际应用中,是将报文经过Base64编码之后放在payload里,
sign,对(base64enc)header.(base64enc)payload进行签名,具体用的什么签名算法,根据header里的alg字段判断。
Q1:sign通过base64编码,因为官方文档,我见有写需要base64编码,不然验签报错:
java.security.SignatureException: Signature length not correct: got 344 but was expecting 256
这个问题解决参考博客。概述就是签名和验签的时候用的编码和解码方式要一致。
RSA
以下代码借鉴别人博客,但连接我忘了,

/*** RSA最大加密明文大小*/private static final int MAX_ENCRYPT_BLOCK = 1024;/*** RSA最大解密密文大小*/private static final int MAX_DECRYPT_BLOCK = 1024;/*** 获取密钥对** @return 密钥对*/public static KeyPair getKeyPair() throws Exception {KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");generator.initialize(1024);return generator.generateKeyPair();}/*** 获取私钥** @param privateKey 私钥字符串* @return*/public static PrivateKey getPrivateKey(String privateKey) throws Exception {KeyFactory keyFactory = KeyFactory.getInstance("RSA");byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);return keyFactory.generatePrivate(keySpec);}/*** 获取公钥** @param publicKey 公钥字符串* @return*/public static PublicKey getPublicKey(String publicKey) throws Exception {KeyFactory keyFactory = KeyFactory.getInstance("RSA");byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes());X509EncodedKeySpec keySpec = new X509EncodedKeySpec(new BASE64Decoder().decodeBuffer(publicKey));return keyFactory.generatePublic(keySpec);}/*** RSA加密** @param data 待加密数据* @param publicKey 公钥* @return*/public static String encrypt(String data, PublicKey publicKey) throws Exception {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);int inputLen = data.getBytes().length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offset = 0;byte[] cache;int i = 0;// 对数据分段加密while (inputLen - offset > 0) {if (inputLen - offset > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK);} else {cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);}out.write(cache, 0, cache.length);i++;offset = i * MAX_ENCRYPT_BLOCK;}byte[] encryptedData = out.toByteArray();out.close();// 获取加密内容使用base64进行编码,并以UTF-8为标准转化成字符串// 加密后的字符串return new String(Base64.encodeBase64String(encryptedData));}/*** RSA解密** @param data 待解密数据* @param privateKey 私钥* @return*/public static String decrypt(String data, PrivateKey privateKey) throws Exception {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] dataBytes = Base64.decodeBase64(data);int inputLen = dataBytes.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offset = 0;byte[] cache;int i = 0;// 对数据分段解密while (inputLen - offset > 0) {if (inputLen - offset > MAX_DECRYPT_BLOCK) {cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK);} else {cache = cipher.doFinal(dataBytes, offset, inputLen - offset);}out.write(cache, 0, cache.length);i++;offset = i * MAX_DECRYPT_BLOCK;}byte[] decryptedData = out.toByteArray();out.close();// 解密后的内容return new String(decryptedData, "UTF-8");}/*** 签名** @param data 待签名数据* @param privateKey 私钥* @return 签名*/public static String sign(String data, PrivateKey privateKey) throws Exception {byte[] keyBytes = privateKey.getEncoded();PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey key = keyFactory.generatePrivate(keySpec);Signature signature = Signature.getInstance("SHA256withRSA");signature.initSign(key);signature.update(data.getBytes());return new String(Base64.encodeBase64(signature.sign()));}/*** 验签** @param srcData 原始字符串* @param publicKey 公钥* @param sign 签名* @return 是否验签通过*/public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception {byte[] keyBytes = publicKey.getEncoded();X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PublicKey key = keyFactory.generatePublic(keySpec);Signature signature = Signature.getInstance("SHA256withRSA");signature.initVerify(key);signature.update(srcData.getBytes());return signature.verify(Base64.decodeBase64(sign.getBytes()));}public static PublicKey getPublicKey1(String key) throws Exception {X509Certificate cert = null;try {cert = X509Certificate.getInstance(key.getBytes());} catch (Exception e) {e.printStackTrace();}PublicKey publicKey = cert.getPublicKey();return publicKey;}

比较好使。其中getPublicKey1 是另一种将密钥字符串转publicKey的方式,不同格式的密钥字符串规范,转publicKey类型的时候,是不一样的,对方开发人员没有签名验签和加解密的sdk或者demo。让对方把代码发过来,我才知道,哪里的问题, 关键还是自己知道的少,多读书多看报多敲代码少睡觉,头发一天比一天少。

JWT,JWE,JWS和RSA2相关推荐

  1. jwt重放攻击_4个点搞懂JWT、JWS、JWE

    1.JWT是何物,有哪些常用的场景 JWT(json web token)是设计一种简洁,安全,无状态的token的实现规范rfc7519,通常用于网络请求方和网络接收方之间的网络请求认证. jwt的 ...

  2. JWT、JWE、JWS 、JWK 到底是什么?该用 JWT 还是 JWS?

    JWT 相信很多小伙伴都知道,JSON Web Token,如果在项目中通过 jjwt 来支持 JWT 的话,可能只需要了解 JWT 一个概念即可,但是现在很多时候我们可能不是使用 jjwt,而是选择 ...

  3. 一文理解 JWT、JWS、JWE、JWA、JWK、JOSE

    原文收录 GitBook--统一接口认证解决方案 JsonWebToken 关于JsonWebToken的专业名词解释: unsecured JWT:默认头部{"alg": &qu ...

  4. 3 JWT 和 JWS

    上一篇我们提到了token支持JWT格式,那这一篇来盘一下JWT到底是个啥. JSON Web Token(JWT) https://jwt.io JSON Web Token (JWT) (RFC ...

  5. 关于 JWT、JWS、JWE

    JWT(JSON Web Token) JWT 是一个字符串,表示了一组字段声明的集合,以 JSON 格式组织数据,并以 JWS 或 JWE 方式编码. JWT 由 Header.Payload.Si ...

  6. JWT、JWS与JWE

    以前WEB网站认证方式都是基于传统的服务器session+浏览器cookie的Auth手段,近年来Web网站认证方式逐步转变为基于OAuth2等开放协议的SSO模式.其中Json Web Token( ...

  7. JWT攻击手册(附jwt_tool用法,爆破弱密钥等)

    转载至https://www.cnblogs.com/xiaozi/p/12005929.html JSON Web Token(JWT)对于渗透测试人员而言可能是一种非常吸引人的攻击途径,因为它们不 ...

  8. JJWT:JWS, JWE, JWK, JWA, JWT

    JWS, JWE, JWK, JWA, JWT JWS:JSON Web Signature,Digital signature/HMAC specification(签名) JWE:JSON Web ...

  9. 【JWT】JWT JWS JWE | 在线JWS解析工具

    JWT.JWS.JWE 主要参考: https://www.51cto.com/article/630971.html 辅助参考: https://www.jianshu.com/p/50ade6f2 ...

最新文章

  1. spacy如何安装最匹配的版本正规文档en_core_web
  2. springwebflux 页面_Spring WebFlux 入门
  3. MFC中添加自己定义的消息
  4. 互联网产品接入支付功能如何测试?
  5. mysql chartset utf 8_[数据库]MySQL chartset_星空网
  6. 赫塔•米勒获诺贝尔文学奖说明了什么?
  7. VLAN访问控制列表(VACL)的配置方法
  8. 【报告分享】2019-2020年企业调薪参考手册.pdf(附下载链接)
  9. 信息系统项目管理师必背核心考点(十四)变更管理的工作程序
  10. AIDA64内存与缓存测试过了算稳定吗_【AMD R52600X】装机实录、基本特性介绍及性能测试...
  11. PostgreSQL导入导出CSV
  12. 虚幻引擎(UE4) UMG 创建菜单
  13. SQL注入-入门需了解项目
  14. android获取指纹信息最新,# android 指纹识别并检测指纹库是否变更
  15. Redis的Java客户端——Jedis
  16. 酷狗计算机自动续费,怎么取消酷狗自动续费-APP自动续费关不了?可在微信支付宝这样操作!...
  17. 为什么 200M 宽带,打王者荣耀还是会有 460 的延迟?
  18. svn版本库浏览器_WebSVN—在线版本库浏览器
  19. F函数的极大极大算法
  20. Java 解析摩尔斯电码并生成音频流/文件

热门文章

  1. OpenGL-非均匀有理B样条
  2. 内部干货 | 阿里CEO逍遥子:学会“用人做事”,而不是“做事用人”...
  3. 世界上最致命的二十种毒蛇(附图片)
  4. openwrt网络唤醒计算机,蜗牛星际 82583V网卡在win10中开启网络唤醒开机的方法
  5. 【Python】怎么在pip下载的时候设置镜像?(常见的清华镜像、阿里云镜像以及中科大镜像)
  6. Android 实现简单的登陆注册功能(SharedPreferences和SQLite)
  7. 交流微电网仿真模型(包含PCS)【含个人笔记+建模过程】
  8. 2021年山东省安全员C证考试内容及山东省安全员C证新版试题
  9. MySQL最左匹配原则,道儿上兄弟都得知道的原则
  10. Python多个数组合并