JWT,JWE,JWS和RSA2
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相关推荐
- jwt重放攻击_4个点搞懂JWT、JWS、JWE
1.JWT是何物,有哪些常用的场景 JWT(json web token)是设计一种简洁,安全,无状态的token的实现规范rfc7519,通常用于网络请求方和网络接收方之间的网络请求认证. jwt的 ...
- JWT、JWE、JWS 、JWK 到底是什么?该用 JWT 还是 JWS?
JWT 相信很多小伙伴都知道,JSON Web Token,如果在项目中通过 jjwt 来支持 JWT 的话,可能只需要了解 JWT 一个概念即可,但是现在很多时候我们可能不是使用 jjwt,而是选择 ...
- 一文理解 JWT、JWS、JWE、JWA、JWK、JOSE
原文收录 GitBook--统一接口认证解决方案 JsonWebToken 关于JsonWebToken的专业名词解释: unsecured JWT:默认头部{"alg": &qu ...
- 3 JWT 和 JWS
上一篇我们提到了token支持JWT格式,那这一篇来盘一下JWT到底是个啥. JSON Web Token(JWT) https://jwt.io JSON Web Token (JWT) (RFC ...
- 关于 JWT、JWS、JWE
JWT(JSON Web Token) JWT 是一个字符串,表示了一组字段声明的集合,以 JSON 格式组织数据,并以 JWS 或 JWE 方式编码. JWT 由 Header.Payload.Si ...
- JWT、JWS与JWE
以前WEB网站认证方式都是基于传统的服务器session+浏览器cookie的Auth手段,近年来Web网站认证方式逐步转变为基于OAuth2等开放协议的SSO模式.其中Json Web Token( ...
- JWT攻击手册(附jwt_tool用法,爆破弱密钥等)
转载至https://www.cnblogs.com/xiaozi/p/12005929.html JSON Web Token(JWT)对于渗透测试人员而言可能是一种非常吸引人的攻击途径,因为它们不 ...
- JJWT:JWS, JWE, JWK, JWA, JWT
JWS, JWE, JWK, JWA, JWT JWS:JSON Web Signature,Digital signature/HMAC specification(签名) JWE:JSON Web ...
- 【JWT】JWT JWS JWE | 在线JWS解析工具
JWT.JWS.JWE 主要参考: https://www.51cto.com/article/630971.html 辅助参考: https://www.jianshu.com/p/50ade6f2 ...
最新文章
- spacy如何安装最匹配的版本正规文档en_core_web
- springwebflux 页面_Spring WebFlux 入门
- MFC中添加自己定义的消息
- 互联网产品接入支付功能如何测试?
- mysql chartset utf 8_[数据库]MySQL chartset_星空网
- 赫塔•米勒获诺贝尔文学奖说明了什么?
- VLAN访问控制列表(VACL)的配置方法
- 【报告分享】2019-2020年企业调薪参考手册.pdf(附下载链接)
- 信息系统项目管理师必背核心考点(十四)变更管理的工作程序
- AIDA64内存与缓存测试过了算稳定吗_【AMD R52600X】装机实录、基本特性介绍及性能测试...
- PostgreSQL导入导出CSV
- 虚幻引擎(UE4) UMG 创建菜单
- SQL注入-入门需了解项目
- android获取指纹信息最新,# android 指纹识别并检测指纹库是否变更
- Redis的Java客户端——Jedis
- 酷狗计算机自动续费,怎么取消酷狗自动续费-APP自动续费关不了?可在微信支付宝这样操作!...
- 为什么 200M 宽带,打王者荣耀还是会有 460 的延迟?
- svn版本库浏览器_WebSVN—在线版本库浏览器
- F函数的极大极大算法
- Java 解析摩尔斯电码并生成音频流/文件
热门文章
- OpenGL-非均匀有理B样条
- 内部干货 | 阿里CEO逍遥子:学会“用人做事”,而不是“做事用人”...
- 世界上最致命的二十种毒蛇(附图片)
- openwrt网络唤醒计算机,蜗牛星际 82583V网卡在win10中开启网络唤醒开机的方法
- 【Python】怎么在pip下载的时候设置镜像?(常见的清华镜像、阿里云镜像以及中科大镜像)
- Android 实现简单的登陆注册功能(SharedPreferences和SQLite)
- 交流微电网仿真模型(包含PCS)【含个人笔记+建模过程】
- 2021年山东省安全员C证考试内容及山东省安全员C证新版试题
- MySQL最左匹配原则,道儿上兄弟都得知道的原则
- Python多个数组合并