系統交互流程(OAuth2.0)
![clipboard.png clipboard.png](http://static.javashuo.com/static/loading.gif)
受權碼生成
加密解密算法(AES)
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
/**
* @author liuzhongxu
* @date 2019/4/16
*/
public class AESUtil {
/**
* 算法名稱
*/
public static final String KEY_ALGORITHM = "AES";
/**
*算法名稱/加密模式/填充方式
*/
public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
/**
* 編碼
*/
public static final String CHARSET_NAME = "UTF-8";
/**
*
* 生成密鑰key對象
* @param keyStr 密鑰字符串
* @return 密鑰對象
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws Exception
*/
private static SecretKey keyGenerator(String keyStr) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(keyStr.getBytes(CHARSET_NAME), KEY_ALGORITHM);
return secretKey;
}
/**
* 加密數據
* @param data 待加密數據
* @param key 密鑰
* @return 加密後的數據
*/
public static String encrypt(String data, String key) throws Exception {
Key secretKey = keyGenerator(key);
IvParameterSpec iv = new IvParameterSpec(key.getBytes(CHARSET_NAME));
// 實例化Cipher對象,它用於完成實際的加密操做
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
// 初始化Cipher對象,設置爲加密模式
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
byte[] results = cipher.doFinal(data.getBytes(CHARSET_NAME));
// 執行加密操做。加密後的結果一般都會用Base64編碼進行傳輸
return Base64.encodeBase64String(results);
}
/**
* 解密數據
* @param data 待解密數據
* @param key 密鑰
* @return 解密後的數據
*/
public static String decrypt(String data, String key) throws Exception {
Key secretKey = keyGenerator(key);
IvParameterSpec iv = new IvParameterSpec(key.getBytes(CHARSET_NAME));
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
//初始化Cipher對象,設置爲解密模式
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
// 執行解密操做
return new String(cipher.doFinal(Base64.decodeBase64(data)));
}
public static void main(String[] args) throws Exception {
String source = "工做模式-->>ECB:電子密碼本模式、CBC:加密分組連接模式、CFB:加密反饋模式、OFB:輸出反饋模式";
System.out.println("原文: " + source);
String key = "A1B2C3D4A1B2C3D4";
String encryptData = encrypt(source, key);
System.out.println("加密後: " + encryptData);
String decryptData = decrypt(encryptData, key);
System.out.println("解密後: " + decryptData);
}
}
計算簽名
/**
* 計算簽名
*/
private static String calculateSign(String source, String accessSecret) throws InvalidKeyException {
try {
//HmacSHA256加密
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(accessSecret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(source.getBytes("UTF-8"));
//bas64加密
return Base64.getEncoder().encodeToString(signData);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("HMAC-SHA1 not supported.");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("UTF-8 not supported.");
}
}