圖1:使用工具解密接口返回數據的過程

為什么需要接口返回加密?

在現代應用中,接口返回的數據常常包含用戶的個人信息和敏感數據。如果這些信息以明文形式傳輸,很容易被網絡攻擊者截獲。因此,接口返回加密是保護數據隱私和安全的重要手段。加密后的數據即使被截獲,也無法被輕易解讀。

加密過程
圖2:加密和解密的過程示意圖

在實現接口返回加密時,常用的加密方法包括對稱加密和非對稱加密。非對稱加密如RSA具有較高的安全性,因為它使用公鑰和私鑰進行加密和解密。

// 示例代碼:接口返回加密實現
public class ResultEncipher implements ResponseBodyAdvice {
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        // 檢查URL并進行加密
        if (url.contains("phones")) {
            // 使用RSA加密
            String result = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(body);
            log.info("后端返回參數:" + request);
            requestList = RSAEncrypt.publicKeyEncryptBigStr(request, publicKey, point);
        }
        return requestList;
    }
}

接口返回加密不僅保障數據傳輸的安全性,還提升了用戶對應用安全性的信心。

實現接口返回加密的步驟

生成RSA公鑰與密鑰

在接口返回加密的實現過程中,生成RSA公鑰與私鑰是至關重要的第一步。這些密鑰用于加密和解密數據,確保通信的安全性。RSA非對稱加密技術使用公鑰進行加密,而私鑰則用于解密,保證數據在傳輸過程中不被未經授權的方訪問。

為了生成RSA公鑰和私鑰,可以使用以下代碼示例:

import java.util.HashMap;
import java.util.Map;

public class RSAKeyGenerator {
    public static Map generateKeyPair() {
        Map keyMap = new HashMap();
        keyMap.put("publicKey", "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOUDwJVY1JMY4oSHM1+VKeYZ5T2LjQ4wvENnt0TlRoOYDrUen4Nm3GbVKiGTot76gu7xYL1X9PQvDnYLpUVu0mA2oLrXWZj2ByTW83Ehdc5Y9aLXtNzmm4e6PXtuEtXk2sqUZz+XtBBAUMAne4J9G9DAZVPLFxUUJyzVb9cnK6NQIDAQAB");
        keyMap.put("privateKey", "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAM5QPAlVjUkxjihIczX5Up5hnlPYuNDjC8Q2e3ROVGg5gOtR6fg2bcZtUqIZOi3vqC7vFgvVf09C8OdgulRW7SYDagutdZmPYHJNbzcSF1zlj1ote03Oabh7o9e24S1eTaypRnP5e0EEBQwCd7gn0b0MBlU8sXFRQnLNVv1ycro1AgMBAAECgYAKkJlCcRsXEG6TKYKc1POiIKWW7ZYpPDcyCQgxYIF6BNfRNRSiHUdpzddZbalJCOi33o5mdLxcNrVXY+CmyPzDyeyNWWX8UcL2Wud8vRlWU7kQ+YcCVyS/nqRLBpHb0QgW7bqzb7fRpnmqhfj+A9hzRaoKxsZ8EWQfvN5UcdmQgQJBAKm39ZUaFyuDSpRINHZNHfldasmy9hLyXdTb3sLFj/bPaq0MyORAZPqq6XCu+nnIhVKVyADbXb+8T5kn70lzIbg=");
        return keyMap;
    }
}

生成密鑰示例
圖1: RSA公鑰與私鑰的生成

配置后端加密邏輯

在后端實現接口返回加密時,需要配置加密邏輯以確保數據的安全性。下述代碼片段展示了如何在后端項目中對特定接口返回的數據進行加密。

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONConfig;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
public class ResponseEncryptionAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        String url = serverHttpRequest.getURI().toString();
        if (url.contains("mobile")) {
            ObjectMapper objectMapper = new ObjectMapper();
            String response = objectMapper.writeValueAsString(body);
            String encryptedResponse = RSAEncrypt.publicKeyEncrypt(response, "publicKey");
            return encryptedResponse;
        }
        return body;
    }
}

后端加密過程
圖2: 后端加密邏輯配置示意圖

通過這些步驟,開發者可以有效實現接口返回加密,確保用戶數據在傳輸過程中的安全性。這些技術在保護敏感數據方面發揮著重要作用,尤其是在移動端接口的開發中。

前端與后端的協同實現

前端如何進行數據加密

在前端進行數據加密時,通常使用非對稱加密算法,如RSA來保證數據的安全性。使用RSA加密可以確保只有持有正確密鑰的后端能夠解密數據,這樣可以有效保護用戶的隱私信息。

引入Node.js的RSA庫可以簡化加密的實現過程。首先,前端需要設置公鑰和私鑰,并利用加密工具類來對數據進行加密:

import NodeRSA from "node-rsa";
import {RAS_PRIVATE, RAS_PUBLIC} from "@/ras-key.js";

const crypto = {}

crypto.encrypt = function (cipher = {}) {
  const rsa = new NodeRSA(RAS_PUBLIC)
  rsa.setOptions({encryptionScheme: 'pkcs1'})
  let encrypt = rsa.encrypt(JSON.stringify(cipher), 'base64');
  return {
    encrypt
  }
}

export default crypto

一旦數據被加密,前端通過接口請求將加密后的數據發送到后端,實現安全的數據傳輸。

圖:前端加密工具類的使用示例

后端如何解密接收數據

后端接收到加密數據后,需要使用正確的私鑰進行解密操作。解密的實現可以借助Java的Hutool工具類庫,通過解密方法將加密數據還原成明文數據,以便后續處理。

使用Hutool工具類解密數據的代碼示例如下:

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;

RSA rsa = new RSA(RAS_PRIVATE, null);
byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey);
String decryptSt = StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8);

通過這些步驟,后端能夠安全解密前端傳輸的加密數據,并進行后續的數據處理和響應。


圖:后端解密接收數據的過程示意圖

常見問題與解決方案

加密數據長度過長的問題

在實現接口返回加密時,開發者可能會遇到加密數據長度過長的問題。這通常是由于加密算法的限制或密鑰長度設置不當導致的。對于非對稱加密算法,如RSA,加密數據的長度受密鑰長度的影響。為了有效解決這個問題,可以采取以下措施:

在解決加密數據長度過長的問題時,確保接口返回加密功能的正常運作是關鍵。通過合理配置加密算法和密鑰長度,可以有效優化數據加密過程。

解決中文亂碼的技巧

在數據加密與解密過程中,中文亂碼是一個常見問題,尤其是在使用RSA加密時。亂碼通常是由于字符集不一致或編碼方式不正確導致的。為了解決中文亂碼問題,開發者可以采取以下方法:

通過這些技巧,可以在使用接口返回加密的過程中有效解決中文亂碼問題,提升數據傳輸的可靠性和用戶體驗。

實戰案例:移動端與PC端接口加密

移動端接口加密的實現

在移動端接口加密的實現過程中,主要采用非對稱加密算法RSA對接口返回的數據進行加密。此方法確保只有持有正確私鑰的后端能夠解密數據,從而保護用戶隱私信息。實現移動端接口加密的步驟包括使用Node.js的RSA庫進行加密設置,并通過工具類對數據進行加密。

為了實現移動端接口加密,可使用以下示例代碼:

import NodeRSA from "node-rsa";
import {RAS_PUBLIC} from "@/ras-key.js";

const crypto = {}

crypto.encrypt = function (cipher = {}) {
  const rsa = new NodeRSA(RAS_PUBLIC)
  rsa.setOptions({encryptionScheme: 'pkcs1'})
  let encrypt = rsa.encrypt(JSON.stringify(cipher), 'base64');
  return {
    encrypt
  }
}

export default crypto

使用該加密工具類后,前端可以將加密的數據通過接口請求發送到后端,實現安全的數據傳輸。具體實現中,需要確保RSA公鑰的正確配置,以避免加密過程中的錯誤。

PC端接口的兼容性處理

在處理PC端接口時,通常不需要對返回的數據進行加密。由于PC端接口不涉及敏感數據傳輸,因此可以保持返回數據的明文狀態。然而,在某些情況下,可能需要對數據進行簡單的驗證或其他處理,以確保數據的完整性和安全性。

為了實現PC端接口的兼容性處理,可以根據請求的URL特征進行判斷。例如,使用Spring Boot框架時,可以通過攔截器對請求進行檢查,決定是否需要加密處理。以下代碼展示了如何在后端實現接口的兼容性處理:

import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
public class ResultEncipher implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        String url = serverHttpRequest.getURI().toString();
        if (url.contains("mobile")) {
            // 在移動端接口進行加密處理
            return encryptResponse(body);
        } else {
            // 在PC端返回明文數據
            return body;
        }
    }

    private String encryptResponse(Object body) {
        // 加密邏輯實現
        return "encrypted data";
    }
}

通過這些配置,后端能夠自動識別接口類型,并且對移動端接口返回的數據進行加密處理,而對PC端接口保持明文傳輸。此方法不僅提高了數據傳輸的安全性,還確保了系統的靈活性和兼容性。

上一篇:

使用 Ipstack 構建位置感知應用程序

下一篇:

手機號歸屬地查詢:輕松定位陌生來電的真實身份
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費