1.微信公众号前端调用api所需签名SHA1算法
public String SHA1(String str) {
try {
MessageDigest digest = java.security.MessageDigest
.getInstance("SHA-1"); //如果是SHA加密只需要将"SHA-1"改成"SHA"即可
digest.update(str.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexStr = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexStr.append(0);
}
hexStr.append(shaHex);
}
return hexStr.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
2.微信小程序获取用户信息,unionid,手机号等私密信息
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.*;
import java.util.*;
private static final int BASE = 16;
private static final String KEY_ALGORITHM = "AES";
private static final String ALGORITHM_STR = "AES/CBC/PKCS7Padding";
public String decryptData(String encryptDataB64, String sessionKeyB64, String ivB64) {
byte[] encryptedData = Base64.decode(encryptDataB64);
byte[] sessionKeyData = Base64.decode(sessionKeyB64);
byte[] ivData = Base64.decode(ivB64);
byte[] encryptedText;
// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
if (sessionKeyData.length % BASE != 0) {
int groups = sessionKeyData.length / BASE + 1;
byte[] temp = new byte[groups * BASE];
Arrays.fill(temp, (byte) 0);
System.arraycopy(sessionKeyData, 0, temp, 0, sessionKeyData.length);
sessionKeyData = temp;
}
// 初始化
Security.addProvider(new BouncyCastleProvider());
// 转化成JAVA的密钥格式
Key key = new SecretKeySpec(sessionKeyData, KEY_ALGORITHM);
// 初始化cipher
try {
Cipher cipher = Cipher.getInstance(ALGORITHM_STR, "BC");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivData));
encryptedText = cipher.doFinal(encryptedData);
} catch (NoSuchAlgorithmException | NoSuchProviderException | NoSuchPaddingException | InvalidKeyException |
InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) {
throw new BizRejectException(e.getMessage());
}
return new String(encryptedText);
}