1.为什么要进行加密?
在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的。因此就要对需要传输的数据进行在客户端进行加密,然后在服务器进行解密!
2.开发给你一段代码,如何写出想要的加密算法?
- 从前台到后台,讲解一个完整数据传输加密解密的流程。前台CryptoJS中进行数据加密,通过发送数据到服务器,服务器进行解密!
以登录为例,通过抓包可知:
- 先解passWord的值
前端CryptoJS加密,代码提供:
* handleForm() {
const form = JSON.parse(JSON.stringify(this.loginForm))
const {
password } = form
if (!password) {
return form }
const str = JSON.stringify({
passWord: password })
const timestamp = Date.now() + ''
form.password = Encrypt(str, timestamp)
form.timestamp = timestamp
return form
}
*
* export function Encrypt(text, token) {
// 后台
const {
key, iv } = getKeyAndIv(token)
return CryptoJS.AES.encrypt(text, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString()
}
function getKeyAndIv(token) {
token = token || auth.getToken()
const md5Token = md5(token).toLowerCase()
const key = md5Token.slice(0, 16)
const iv = md5Token.slice(-16)
return {
key, iv }
}
后端PHP解密,代码提供:
$timestamp = md5($param['timestamp']);
$key = substr($timestamp, 0, 16);
$iv = substr($timestamp, -16);
$decryptPassword = openssl_decrypt(base64_decode($param['passWord']), 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
分析:通过前后端代码分析得出前端是通过CryptoJS.AES来进行对称加密,开发key和iv值是未登录时是取当前时间的时间搓通过md5加密转小写32位后分别取前16位和后16位作为key和iv值,data是json格式拼接进行入参:{“passWord”:""+password+""}
- 开始编写加密算法(java语言)
/**
* 加密方法
* @param data 要加密的数据
* @param key 加密key
* @param iv 加密iv
* @return 加密的结果
* @throws Exception
*/
public static String encrypt(String data,String key,String iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
byte[] keyBytes = key.getBytes("utf-8");
SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES");
//使用CBC模式,需要一个向量iv,可增加加密算法的强度
byte[] ivBytes = iv