使用API-Key定向加密对外接口案例
整体思路
前端通过某种方式生成一个动态字段,例如时间戳、随机数、UUID 等。 前端将动态字段和其他请求参数一起发送给后端,并对请求参数进行加密。
后端通过相同的加密算法,使用动态字段生成 API-KEY,并与前端传递的 API-KEY 进行比对,验证请求的合法性。
这种方案可以确保每次请求都使用不同的动态字段生成
API-KEY,从而提高安全性。同时,前后端都需要共享相同的加密算法和动态字段生成规则,以便正确生成和验证 API-KEY。
下面是一个示例的前后端代码,演示了如何实现这种接口加密方案。
前端生成 API-KEY
前端使用 hashFunction
函数来生成 API-KEY,用于加密开放接口请求。hashFunction
是一个哈希函数,用于将一个字符串数据转换成固定长度的哈希值。
// 生成动态字段的函数,这里以时间戳为例
function generateDynamicField() {
const timestamp = new Date().getTime();
return timestamp;
}
// 加密函数,这里使用简单的哈希函数作为示例
function encryptData(data, dynamicField) {
// 将请求参数和动态字段拼接成字符串
const dataToEncrypt = data + dynamicField;
// 使用哈希函数对字符串进行加密
const encryptedData = hashFunction(dataToEncrypt);
return encryptedData;
}
// 构造请求参数
const requestData = {
// 请求参数
};
// 生成动态字段
const dynamicField = generateDynamicField();
// 加密请求参数
const encryptedData = encryptData(JSON.stringify(requestData), dynamicField);
// 发送请求
fetch('/api/endpoint', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
data: encryptedData,
dynamicField: dynamicField,
}),
})
.then(response => {
// 处理响应
})
.catch(error => {
// 处理错误
});
后端验证 API-KEY
// 解密函数,这里使用简单的哈希函数作为示例
public String decryptData(String encryptedData, String dynamicField) {
// 将加密的数据和动态字段拼接成字符串
const dataToDecrypt = encryptedData + dynamicField;
// 使用哈希函数对字符串进行解密
const decryptedData = hashFunction(dataToDecrypt);
return decryptedData;
}
// 在请求处理方法中获取请求参数并解密
@RequestMapping(value = "/api/endpoint", method = RequestMethod.POST)
public ResponseEntity<String> handleRequest(@RequestBody RequestData requestData) {
// 从请求体中获取加密的数据和动态字段
String encryptedData = requestData.getData();
String dynamicField = requestData.getDynamicField();
// 解密请求参数
String decryptedData = decryptData(encryptedData, dynamicField);
// 验证请求参数的合法性
// ...
return ResponseEntity.ok("Request authorized.");
}