范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JWE安全传输敏感数据的最佳实践(上)

  起源
  最近工作需求,提供几个API,但是数据是敏感数据,最好是不要暴露出来(PS: 本来接口就已经是HTTPS,也足够安全)
  好吧,老板注重数据安全,通过网上一顿操作,发现 JSON Web Encryption(JWE),貌似可以拿来用用(PS: 复制粘贴大法)JWE 是什么?
  JWE是"JSON Web Encryption"的缩写,是一种基于JSON的加密规范,用于在网络上传输加密的数据。它定义了一种将JSON数据加密为JWE格式的方法,以确保安全传输。JWE规范使用一种称为"JWE Compact Serialization"的格式来序列化加密后的数据,以便它可以轻松地在不同的系统之间传输。
  JWE使用加密算法来保护数据的机密性,同时使用消息认证码(MAC)算法来验证数据的完整性,以防止数据在传输过程中被篡改。JWE还支持多种密钥管理方法,例如将密钥嵌入到JWE中,或者通过密钥交换协议来获取密钥。
  JWE通常用于保护敏感的网络数据,例如用户凭证、支付信息等等。它是JSON Web Token(JWT)规范的一部分,JWT使用JWE来提供安全性。
  好了,上面搬来了八股文,还不如直接通过代码操作
  首先引入maven依赖,nimbus-jose-jwt 是JWT的一种实现,相信大家也不陌生 		com.nimbusds 		nimbus-jose-jwt 		9.8.1 public class JweRSADemo {      public static String encrypt(String payload, RSAPublicKey publicKey) throws Exception {         // 创建加密器         JWEHeader header = new JWEHeader.Builder(JWEAlgorithm.RSA_OAEP_256, EncryptionMethod.A256GCM).build();         JWEEncrypter jweEncrypter = new RSAEncrypter(publicKey);         // 加密JSON数据         Payload jwePayload = new Payload(payload);         JWEObject jweObject = new JWEObject(header, jwePayload);         jweObject.encrypt(jweEncrypter);         // 将JWE对象转换为JWE字符串         return jweObject.serialize();     }      public static String decrypt(String jwe, RSAPrivateKey privateKey) throws Exception {         // 创建解密器         JWEDecrypter jweDecrypter = new RSADecrypter(privateKey);         // 解密JWE字符串         JWEObject jweObject = JWEObject.parse(jwe);         jweObject.decrypt(jweDecrypter);         // 将解密后的JSON数据转换为JSONObject对象         Payload payload = jweObject.getPayload();         return payload.toString();     }      public static void main(String[] args) throws Exception {         // 创建一个JSON对象         JSONObject payload = new JSONObject();         payload.put("name", "Alice");         payload.put("age", 30);         String jsonString = payload.toJSONString();         // 生成RSA密钥对         KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");         keyPairGenerator.initialize(2048);         KeyPair keyPair = keyPairGenerator.generateKeyPair();         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();         // 加密JSON对象         String jwe = encrypt(jsonString, publicKey);         System.out.println("JWE: " + jwe);         // 解密JWE字符串         String decryptedPayload = decrypt(jwe, privateKey);         System.out.println("Decrypted payload: " + decryptedPayload);     }      }
  成功进行加解密
  接入Spring Boot
  先生成一对公钥和私钥// 生成RSA密钥对 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); KeyPair keyPair = keyPairGenerator.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();  System.out.println("Base64.encode(publicKey.getEncoded()) = " + Base64.encode(publicKey.getEncoded())); System.out.println("Base64.encode(privateKey.getEncoded()) = " + Base64.encode(privateKey.getEncoded()));
  用生成出来的公钥加密数据,加密出来的内容等下作为参数调用,通常公钥都是分发给调用端String publicKeyStr = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsqBTYOqBU5rdpdRX9/owxi0nHsxsyGr/8PWQZ8GtPQilXfNuQEFWO01o0ZU8Agn+wzatpGCOwIgSaEF4p6uI4tyhC8BlnkQZN/GcjbryljzIrRlu8NKsLu40SQO3CYa+p7DA36pdX/nMQ9QceSeGW9e7E5YWuiMhUDgqWVEdmRxX+bxfoNYpBtNlvyxeL0MKEIUVlikYKe+UxKhiPRcwjBIiHKfsY2PszP4h485UjcIWveyJjBu8nEpUgHUqUHdA1nm32WmUMcOhTU41tX6ZoYK6qUBeNX4xnfOG7jnE76Vz2QcsVTnnTqTQ/93nxEIrZsSfQ/vdzi8LryY2xS0EmQIDAQAB"; PublicKey publicKey = getPublicKey(publicKeyStr); //playload 可以是json串,也可以是普通字符串 String encrypt = encrypt("jwe 测试", publicKey); System.out.println(encrypt);
  我们再写一个Controller来接受参数并用私钥解密@RestController public class JWEController {      private static final Logger LOGGER = LoggerFactory.getLogger(JWEController.class);      private final PrivateKey privateKey; 		 		 		/**      * 在构造方法里初始化刚刚生成的私钥      * @throws NoSuchAlgorithmException      * @throws InvalidKeySpecException      */     public JWEController() throws NoSuchAlgorithmException, InvalidKeySpecException {         String privateKeyBase64 = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCyoFNg6oFTmt2l1Ff3+jDGLScezGzIav/w9ZBnwa09CKVd825AQVY7TWjRlTwCCf7DNq2kYI7AiBJoQXinq4ji3KELwGWeRBk38ZyNuvKWPMitGW7w0qwu7jRJA7cJhr6nsMDfql1f+cxD1Bx5J4Zb17sTlha6IyFQOCpZUR2ZHFf5vF+g1ikG02W/LF4vQwoQhRWWKRgp75TEqGI9FzCMEiIcp+xjY+zM/iHjzlSNwha97ImMG7ycSlSAdSpQd0DWebfZaZQxw6FNTjW1fpmhgrqpQF41fjGd84buOcTvpXPZByxVOedOpND/3efEQitmxJ9D+93OLwuvJjbFLQSZAgMBAAECggEAJHg4XcazPeMWEufuR/pkX+nTHWYmZar283bnk0+HM7lirfJoFaVhWj09Q+EgvdfVlHzC6hcuvh9qBrArVqxeh9b86H3RIYWM0o+5Y3SCV+s0G6dgL7oLno9SzH9+LOs+XNVpI6FQbCp/qm+RmqjXtUOv9dlEbZ+DizHUb6TwkpRPMo3BHPUKGpajmP0pgSkQz8x4MWJ0a6SVST+/E7ZbwF8PobzOQCxND2yZQah/TY1EvCCyOM6chGm0loCyC4HGTBmDm/0LcWRqgiI8GiglEijGu2Iha6UR11JaEStHoc1Sy38Orj377bhndm2l19HNOQIslp9m0VP4WUSG3GJDKwKBgQC55+HY29F0H2jy7p94+snPCKVG0uJHu0IKhFN09fChP/1q0PLJuz3Vj07YUjGneSL3RHM1D+HbMYAGnZ+7GFmwIi8FLKBVZDx4L7ENhcPMUM2q0rsBphZuHfD14Hf9I0xUiNrpyTLuVPJfK3kzx2NYQmRGo6tY+INDuI5L2HEELwKBgQD1+c4ilEQtTRvoIa+BfZ/oOBeFaYsQGlLL+8yVbsPsfH+0MMoiIY++my5rDhT//8QXNhnOI1cs7CFKELA/99Mk7y9G/4o+cMb1kAyZJU6zNoSe9Eitdyo0qQQ20NVAW+YWX0zAuAm5bttk1RvVGz/wiuOotVw6oCSR0uUYUWCptwKBgB2psy6f/G6z6FIC4y0xjuva7Ew9r99UMLhu3sYly+xewne9uU+Y8cfWovT/QG8BdCPSJzPLQfVwk4X6tpbqzry855XCxh557PAcY/rNYi2Cox5jm3Uq5B9T5bPFyj9412ARqiRtdxPyN+4ZiLBLWz2k8k0XJmr+1CsFEqdldLr/AoGAEjyqLuAlSeKMriJJO+WPhI0cGVUg7Vm2R89sdKvYtODqKvbvFaa9XJlu0JsjrXNOG5Z0RVdTcE41jaM9HhEGw5dEPxRVMJn19mDuvjAI7LqfDJX6CXprU6owWMwU84ecwI3iR+udNPVmKMywGpXBoNj7VhfUNbiH3ZPwTmRCMXMCgYBi5I1KJ7kyaHKTilJEAhiYv6XBwsJScJkdAXWuA/SdG3aWQAEc4SOrRwqmqbHWYOm827tb20kG09rHnVS+tVSShvCkv4OcAr2X0L04IX9OfvUqI5pPWiQd/VzCQrTPcelixgkUkG4Sc2dRr6gvvFOKFAAVTQrePh9clk8kd3bg+g==";         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBase64.getBytes(StandardCharsets.UTF_8));         KeyFactory keyFactory;         keyFactory = KeyFactory.getInstance("RSA");         privateKey = keyFactory.generatePrivate(keySpec);     }       @GetMapping("/jwe")     public void jwe(@RequestParam String encrypt) throws Exception {         LOGGER.info("接受到的密文:{}", encrypt);         String decrypt = decrypt(encrypt, (RSAPrivateKey) privateKey);         LOGGER.info("解密后的内容:{}", decrypt);     }       public String decrypt(String jwe, RSAPrivateKey privateKey) throws Exception {         // 创建解密器         JWEDecrypter jweDecrypter = new RSADecrypter(privateKey);         // 解密JWE字符串         JWEObject jweObject = JWEObject.parse(jwe);         jweObject.decrypt(jweDecrypter);         // 将解密后的JSON数据转换为JSONObject对象         Payload payload = jweObject.getPayload();         return payload.toString();     }  }
  接下来用刚刚公钥生成的加密数据作为参数,调用接口
  我们看控制台输出,接口调用成功,并成功解密

应用程序服务乱象多净化市场生态需依法有序(记者蒋龙龙)中央网信办近期开展清朗移动互联网应用程序领域乱象整治专项行动,全面规范移动应用程序在搜索下载使用等环节的运营行为,着力解决损害用户合法权益的突出问题。移动互联网乱象丛2022年笔记本电脑市场总结华为份额激增95,联想苹果均下滑2022年即将过去,又来到了进行今年笔记本市场总结的环节。先放上鲸参谋去年的年度总结内容,可以与今年有更直观的对比。2021年度笔记本电脑市场总结联想占28份额,华为荣耀成黑马今年了不起的中国智造节目揭秘,OPPO如何打造自己的科技帝国文手机技巧库众所周知,核心技术是科技公司的立身之本,唯有掌握自研的核心技术,才能把握住未来的方向。而在12月21日,OPPO承接着本月中旬的INNODAY2022未来科技大会,携手华为应用市场2022年度榜单新鲜出炉,原子化服务榜单引热议!12月21日,华为应用市场2022年度榜单一经公布就引发巨大关注。每次华为应用市场年度榜单的公布,都像是一场应用领域的狂欢。从华为应用市场年度榜单中既能看出各大应用在消费者心中的受中国高新科技与产业在美国的频频施压下不断创新突破近期以来,美国继续花样翻新地对中国的半导体等高新科技频频施压。2022年10月7日,美国商务部工业和安全局(BIS)发布一套新的范围广泛的出口管制措施,对向中国出口先进人工智能(A70后清华博士把芯片卖给荣耀OV,近40家机构突击入股来源丨创业邦(IDichuangyebang)作者丨巴里编辑丨子钺图源丨图虫创意煲一碗靓汤,需要花很长时间。正如俗语所说财不入急门,硬科技创业,更要耐得住寂寞坐得了冷板凳。70后创小马智行,何以破冰?小马智行裁员风声传出,自动驾驶寒冬降临。头部企业小马智行裁员背后,今年以来,自动驾驶行业如履薄冰的困境浮出水面。当资本投注止步不前,商业模式不清晰的情况下,小马智行文远知行等自动驾华为推出MateBook14si9版16G1TB,8699元本文转自IT之家作者孤城华为在今年7月份发布了新款MateBook14s笔记本,搭载12代酷睿标压处理器,配备2。5K90Hz屏,售价65997999元。现在,华为又推出了Mate冲击IPO,Soul的无奈与尴尬最近两年,有关Soul上市的新闻已经传过几轮,但次次都差临门一脚。Soul也成为资本圈狼来了故事的主角。01hr先美股再港股Soul的上市路到底有多坎坷孤独是人生中最难捱的时光。于手机如何投屏到笔记本电脑win10?手机投屏电脑的方法分享!手机如何投屏到笔记本电脑win10?很多小伙伴使用的也是Win10的笔记本电脑,那么很多小伙伴想在笔记本电脑上看手机界面该怎么操作呢?很多小伙伴也是不懂,小编通过这几天的测试也是带湖北抗原检测结果上传操作看这里湖北抗原检测结果上传的步骤1。在微信(小程序搜索界面)或支付宝中搜索湖北省抗原检测,在出现的搜索结果界面点击第一个小程序进入微信小程序搜索结果界面支付宝小程序搜索结果界面2。选择个
手机又慢又卡?试试这4个方法来提速,手机速度立马如飞如果你的手机用尽各种办法,卡顿运行慢的问题还是没有解决,那您试试这个方法,立马让您的手机速度如飞,感兴趣的可以长按点赞并且收藏,然后一起来了解一下。先说安卓手机的提速方法,现在我们乐视Y2Pro手机现货发售采用安卓华为HMS,起价599元IT之家7月28日消息,Letv官方宣布,乐视Y2Pro手机已现货开售,起价599元,定位入门旗舰机。432GB版本599元4128GB版本799元6256GB版本999元IT之家便携全画幅微单紧凑型相机索尼A7C索尼A7C这款微单机身规格尺寸为124x71。1x59。7mm,巴掌大小,裸机重量约424克,套机重量约810克,拥有银黑色两种机身颜色可选。这款微单作为一款主打便携的全画幅相机,最大2TB!雷克沙新一代PCIe4。0固态盘NM800PRO发布狂飙7。5GBs一如此前的预热,雷克沙正式发布高端新品NM800PROPCIe4。0固态硬盘,系比NM800更强悍的升级款。外形方面,NM800PRO包装盒和散热贴采用黑金配色,M。2接口,228华为nova10系列手机超强前置影像,记录专属你的七夕情人节华为nova10系列手机一上市,就受到了无数消费者的好评。从外观设计上来看,华为nova10系列传承了nova家族经典美学设计,同时标志性的星耀环设计,以及卓越的前置摄像体验都给消魅族也要造折叠屏了?选择竖向内折的魅友高达76近几年,继全面屏普及之后,手机市场同质化现象越来越严重。国内厂商纷纷推出了自己的折叠屏手机,目的是为了打破手机形态,达到打破僵局的目的。华为小米三星OPPO荣耀vivo等知名品牌都华为鸿蒙3。0荣耀无缘Beta内测等了很久终于等到今天,盼了很久终于等到鸿蒙3。0。HarmonyOS3没有荣耀机型的测试。今天交大家如何升级尝鲜鸿蒙3。0首先鸿蒙14款设备已经开启了Beta版尝鲜报名了。14款尝和平精英空投主题玩法上线!好装备ROG6加持,让吃鸡更尽兴喜欢玩和平精英的小伙伴应该都知道,在每个新版本的海岛地图中,都会植入全新的玩法,比如周年庆期间的飞艇玩法充满年味的龙狮城等,而在最新的更新中,上线了空投节,并且届时也会在地图中增加Steam十大高画质生存游戏,方舟生存进化沧龙是海中霸主近几年,Steam推出了许多出色的生存游戏,今天我就来为大家推荐10款,它们品质优秀质量高,在Steam游戏平台上广为玩家们欢迎。方舟生存进化在Steam生存沙盒游戏方舟生存进化里情怀杀之仙剑三魔尊重楼为什么会爱上紫萱?小爪子前几天在刷视频的时候,意外地再次刷到了仙剑三的片段,想起来是满满的回忆啊!之前写过紫萱长卿的三世相恋,写过龙葵千年的等待,也写过茂茂必平这样的小人物,今天想与各位友友来探讨下原神活动难度越高奖励越少?太气人了,Mhy这么搞只为一件事原神为了让玩家的活跃度更高,每次版本更新了之后都会有活动,随着版本更新的越高,活动的难度也是越来越高了。不知道大家有没有发现,现在原神的活动难度虽然高,但是奖励变化并不是很大,对于