👉这是一个或许对你有用的社群
🐱一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:
《项目实战(视频)》:从书中学,往事中“练” 《互联网高频面试题》:面朝简历学习,春暖花开 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题 《精进 Java 学习指南》:系统学习,互联网主流技术栈 《必读 Java 源码专栏》:知其然,知其所以然

👉这是一个或许对你有用的开源项目
国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。
功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:
Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud 视频教程:https://doc.iocoder.cn 【国内首批】支持 JDK 21+ SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本
来源:juejin.cn/post/7203931072260915259

一、讲个事故
接口安全老生常谈了
过年之前做了过一款飞机大战的H5小游戏,里面无限模式-需要保存用户的积分,因为使用的Body传参,参数是可见的。
为了接口安全我,我和前端约定了传递参数是:用户无限模式的积分+“我们约定的一个数字”+用户id的和,在用Base64加密,请求到服务器我再解密,出用户无限模式的积分;如下:
importorg.bouncycastle.jce.provider.BouncyCastleProvider;importjavax.crypto.Cipher;importjavax.crypto.spec.SecretKeySpec;importjava.nio.charset.StandardCharsets;importjava.security.Security;importjava.util.Base64;/***@module*@author:qingxu.liu*@date:2023-02-0716:14*@copyright**/publicclassAES256Util{privatestaticfinalStringAES="AES";/***初始向量IV,初始向量IV的长度规定为128位16个字节,初始向量的来源为随机生成.*//***加密解密算法/加密模式/填充方式*/privatestaticfinalStringCIPHER_ALGORITHM="AES/CBC/PKCS7Padding";privatestaticfinalBase64.Encoderbase64Encoder=java.util.Base64.getEncoder();privatestaticfinalBase64.Decoderbase64Decoder=java.util.Base64.getDecoder();//通过在运行环境中设置以下属性启用AES-256支持static{Security.setProperty("crypto.policy","unlimited");}/**解决java不支持AES/CBC/PKCS7Padding模式解密*/static{Security.addProvider(newBouncyCastleProvider());}/***AES加密*/publicstaticStringencode(Stringkey,Stringcontent,StringkeyVI){try{javax.crypto.SecretKeysecretKey=newjavax.crypto.spec.SecretKeySpec(key.getBytes(),AES);javax.crypto.Ciphercipher=javax.crypto.Cipher.getInstance(CIPHER_ALGORITHM);cipher.init(javax.crypto.Cipher.ENCRYPT_MODE,secretKey,newjavax.crypto.spec.IvParameterSpec(keyVI.getBytes()));//获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码byte[]byteEncode=content.getBytes(java.nio.charset.StandardCharsets.UTF_8);//根据密码器的初始化方式加密byte[]byteAES=cipher.doFinal(byteEncode);//将加密后的数据转换为字符串returnbase64Encoder.encodeToString(byteAES);}catch(Exceptione){e.printStackTrace();}returnnull;}/***AES解密*/publicstaticStringdecode(Stringkey,Stringcontent,StringkeyVI){try{javax.crypto.SecretKeysecretKey=newjavax.crypto.spec.SecretKeySpec(key.getBytes(),AES);javax.crypto.Ciphercipher=javax.crypto.Cipher.getInstance(CIPHER_ALGORITHM);cipher.init(javax.crypto.Cipher.DECRYPT_MODE,secretKey,newjavax.crypto.spec.IvParameterSpec(keyVI.getBytes()));//将加密并编码后的内容解码成字节数组byte[]byteContent=base64Decoder.decode(content);//解密byte[]byteDecode=cipher.doFinal(byteContent);returnnewString(byteDecode,java.nio.charset.StandardCharsets.UTF_8);}catch(Exceptione){e.printStackTrace();}returnnull;}/***AES加密ECB模式PKCS7Padding填充方式*@paramstr字符串*@paramkey密钥*@return加密字符串*@throwsException异常信息*/publicstaticStringaes256ECBPkcs7PaddingEncrypt(Stringstr,Stringkey)throwsException{Ciphercipher=Cipher.getInstance("AES/ECB/PKCS7Padding");byte[]keyBytes=key.getBytes(StandardCharsets.UTF_8);cipher.init(Cipher.ENCRYPT_MODE,newSecretKeySpec(keyBytes,AES));byte[]doFinal=cipher.doFinal(str.getBytes(StandardCharsets.UTF_8));returnnewString(Base64.getEncoder().encode(doFinal));}/***AES解密ECB模式PKCS7Padding填充方式*@paramstr字符串*@paramkey密钥*@return解密字符串*@throwsException异常信息*/publicstaticStringaes256ECBPkcs7PaddingDecrypt(Stringstr,Stringkey)throwsException{Ciphercipher=Cipher.getInstance("AES/ECB/PKCS7Padding");byte[]keyBytes=key.getBytes(StandardCharsets.UTF_8);cipher.init(Cipher.DECRYPT_MODE,newSecretKeySpec(keyBytes,AES));byte[]doFinal=cipher.doFinal(Base64.getDecoder().decode(str));returnnewString(doFinal);}}
亲测100%可用~~~
欢迎加入我的知识星球,全面提升技术能力。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
本篇文章来源于微信公众号: Java基基
微信扫描下方的二维码阅读本文

Comments NOTHING