感受:
其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。
特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。
也祝愿各位同学,都能找到自己心动的offer。
分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档
ps:
该篇解析使用的是PKCS7Padding,懂的都懂。
Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS7Padding”, “BC”);
不多说了,上代码(亲自实践可用):
先导入核心的jar依赖:
org.bouncycastle
bcprov-jdk16
1.46
WeChatUtil:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.tomcat.util.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.security.*;
import java.security.spec.InvalidParameterSpecException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@Component
public class WeChatUtil {
private static final Logger log = LoggerFactory.getLogger(WeChatUtil.class);
@Value(“${wechat.applets.appid}”)
private String appId;
@Value(“${wechat.applets.appsecret}”)
private String appSecret;
//算法名
public static final String KEY_NAME = “AES”;
// 加解密算法/模式/填充方式
// ECB模式只用密钥即可对数据进行加密解密,CBC模式需要添加一个iv
public static final String CIPHER_ALGORITHM = “AES/CBC/PKCS7Padding”;
/**
-
微信小程序-个人信息解密
-
@param encryptedData
-
@param sessionKey
-
@param iv
-
@return
*/
public static String getUserInfo(String encryptedData, String sessionKey, String iv) {
String result = “”;
// 被加密的数据
byte[] dataByte = Base64.decodeBase64(encryptedData);
// 加密秘钥
byte[] keyByte = Base64.decodeBase64(sessionKey);
// 偏移量
byte[] ivByte = Base64.decodeBase64(iv);
try {
// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
int base = 16;
if (keyByte.length % base != 0) {
int groups = keyByte.length / base
- (keyByte.length % base != 0 ? 1 : 0);
byte[] temp = new byte[groups * base];
Arrays.fill(temp, (byte) 0);
System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
keyByte = temp;
}
// 初始化
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS7Padding”, “BC”);
SecretKeySpec spec = new SecretKeySpec(keyByte, “AES”);
AlgorithmParameters parameters = AlgorithmParameters
.getInstance(“AES”);
parameters.init(new IvParameterSpec(ivByte));
// 初始化
cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
byte[] resultByte = cipher.doFinal(dataByte);
if (null != resultByte && resultByte.length > 0) {
result = new String(resultByte, “UTF-8”);
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidParameterSpecException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
return result;
}
/**
-
获取微信小程序 session_key 和 openid
-
@param code 调用微信登陆返回的Code
-
@return
*/
public JSONObject getSessionKeyAndOpenid(String code) {
//微信端登录code值
String wxCode = code;
//请求地址 https://api.weixin.qq.com/sns/jscode2session
String requestUrl = “https://api.weixin.qq.com/sns/jscode2session”;
Map<String, String> requestUrlParam = new HashMap<>();
//开发者设置中的appId
requestUrlParam.put(“appid”, appId);
//开发者设置中的appSecret
requestUrlParam.put(“secret”, appSecret);
//小程序调用wx.login返回的code
requestUrlParam.put(“js_code”, wxCode);
//默认参数 authorization_code
requestUrlParam.put(“grant_type”, “authorization_code”);
//发送post请求读取调用微信 https://api.weixin.qq.com/sns/jscode2session 接口获取openid用户唯一标识
JSONObject jsonObject = JSON.parseObject(sendPost(requestUrl, requestUrlParam));
return jsonObject;
}
/**
-
微信 数据解密
-
对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
-
对称解密的目标密文:encrypted=Base64_Decode(encryptData)
-
对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节
-
对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节
-
@param encrypted 目标密文
-
@param session_key 会话ID
-
@param iv 加密算法的初始向量
*/
public static String wxDecrypt(String encrypted, String session_key, String iv) {
String json = null;
byte[] encrypted64 = org.apache.tomcat.util.codec.binary.Base64.decodeBase64(encrypted);
byte[] key64 = org.apache.tomcat.util.codec.binary.Base64.decodeBase64(session_key);
byte[] iv64 = org.apache.tomcat.util.codec.binary.Base64.decodeBase64(iv);
byte[] data;
try {
init();
总结
对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)
Java面试精选题、架构实战文档
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!
茫期等等)
[外链图片转存中…(img-8v7b3yfm-1715074786034)]
Java面试精选题、架构实战文档
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!