前端js加密数据,后端java解密数据的一个解决方案以及代码演示(极简版) -- ----安全会差一点

前端js加密数据,后端java解密数据的一个解决方案以及代码演示(极简版)

一、前端JS加密(极简版)

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

<script>
function simpleEncrypt(data, key) {
    // 直接使用ECB模式(无需IV)
    return CryptoJS.AES.encrypt(data, key).toString();
}

// 示例
const key = "simplekey1234567"; // 16位密钥(128位)
const encrypted = simpleEncrypt("Hello World", key);
console.log("加密结果:", encrypted); // 输出Base64字符串
</script>

二、后端Java解密(极简版)

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class SimpleDecryptor {
    public static String decrypt(String encryptedData, String key) throws Exception {
        byte[] keyBytes = key.getBytes();
        SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES");
        
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        
        byte[] decodedData = Base64.getDecoder().decode(encryptedData);
        return new String(cipher.doFinal(decodedData));
    }

    // 测试
    public static void main(String[] args) throws Exception {
        String key = "simplekey1234567";
        String encryptedData = "前端生成的加密字符串";
        System.out.println(decrypt(encryptedData, key));
    }
}

三、核心特点

  1. 极简实现

    • 前端仅需 3 行加密代码
    • 后端仅需 5 行解密代码
    • ECB模式省略了IV处理
  2. 使用要求

    • 密钥长度:16字符(128位)
    • 前后端统一使用 AES/ECB/PKCS5Padding 模式

### Java环境下uni-app微信小程序获取用户手机号的方法 在Java环境中使用uni-app开发微信小程序并获取用户的手机号涉及多个方面。具体来说,在前端部分,通过调用微信提供的接口实现授权登录以及请求用户手机号码;而在服务端,则需处理来自客户端的数据验证与存储。 #### 客户端(uni-app) 为了能够成功获取用户的手机号,应用程序需要先完成基础的登录操作[^2]: ```javascript // 登录函数定义 login() { let that = this; uni.login({ provider: 'weixin', success(res) { console.log('Login Success', res); // 将code发送给服务器换取openid等信息 that.getCode(); }, fail(err) { console.error('Login Failed', err); } }); } ``` 当应用已经获得了必要的权限之后,可以进一步尝试去取得用户的电话号码。这一步骤同样依赖于`wx.getPhoneNumber()` API 的调用: ```javascript getPhoneNumber(e){ if (!e.detail.errMsg || e.detail.errMsg !== "getPhoneNumber:ok") { wx.showToast({title:'您拒绝了提供手机号'}); return false; } else { const iv = e.detail.iv; const encryptedData = e.detail.encryptedData; // 发送加密数据至后台解密 uni.request({ url: `${this.serverUrl}/decryptPhone`, // 后台地址 method:"POST", data:{ code:this.code, iv:iv, encryptedData:encryptedData }, success:(res)=>{ console.log("Get Phone Number Result:",res.data.phoneNumber); } }) } } ``` 上述代码片段展示了如何捕获用户同意分享其手机号后的回调事件,并将获得的信息传递给后端进行下一步处理。 #### 服务端(Java) 对于Java编写的服务端而言,主要职责在于接收从前端传来的参数并对这些经过AES算法加密过的资料做解析工作。通常情况下会利用WeChat官方所提供的工具类或者第三方库来化这个过程。下面给出了一段单的Spring Boot风格的例子用于演示目的: ```java @RestController @RequestMapping("/api") public class WechatController { @PostMapping("/decryptPhone") public ResponseEntity<String> decryptPhone(@RequestBody Map<String, String> params) throws Exception{ WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appid); String session_key = getSessionKey(params.get("code")); // 自行实现此方法以交换session key JSONObject json = JSON.parseObject(pc.decrypt(encryptedData,params.get("iv"),session_key)); return ResponseEntity.ok(json.getString("pureMsg")); } private String getSessionKey(String js_code){ RestTemplate restTemplate=new RestTemplate(); HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); ResponseEntity<Map> response=restTemplate.exchange( "https://api.weixin.qq.com/sns/jscode2session?appid={APPID}&secret={SECRET}&js_code="+js_code+"&grant_type=authorization_code", HttpMethod.GET,entity,Map.class,"your_app_id","your_secret"); return (String)((LinkedHashMap)(response.getBody())).get("session_key"); } } ``` 这段程序说明了怎样设置一个RESTful Web Service 来接受来自uni-app的小程序请求,并执行相应的业务逻辑——即对接收到的数据实施解密动作从而得到真实的手机号码。 请注意以上仅为概念性的指导而非完整的解决方案,实际项目中还需要考虑更多的细节比如安全性保障措施、异常情况下的错误提示等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值