首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Web 公開 API 安全與時效性保障:對稱加密 + 時間戳驗證實踐

     編輯:Java 綜合教學

Web 公開 API 安全與時效性保障實踐

業務流程

流程圖

服務暴露給未登錄移動端,需保證:

  1. 安全性:參數加密,防竄改洩露。
  2. 即時性:鏈接帶時間戳,過期失效,防重放攻擊。

對稱加密保障機密性

排除不可逆加密(MD5/SHA),同系統加解密無需非對稱。選擇 DES(JDK JCE 實現),可換 AES 等。工具類核心:

public class EncryptionDecryption {
    private static final String DEFAULT_KEY = "helloDecrypt";
    private Cipher encryptCipher, decryptCipher;

    public EncryptionDecryption(String key) throws Exception {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        Key k = new SecretKeySpec(padKey(key), "DES");
        encryptCipher = Cipher.getInstance("DES"); encryptCipher.init(Cipher.ENCRYPT_MODE, k);
        decryptCipher = Cipher.getInstance("DES"); decryptCipher.init(Cipher.DECRYPT_MODE, k);
    }
    public String encrypt(String str) { return byteArr2HexStr(encryptCipher.doFinal(str.getBytes())); }
    public String decrypt(String hex) { return new String(decryptCipher.doFinal(hexStr2ByteArr(hex))); }
    // 輔助方法:byte[]↔HexString、Key 填充略
}

時間戳保障即時性

加密時拼接 param1,param2,yyyyMMddHHmm(分鐘級粒度,可調秒/毫秒)。解密後驗證:

private Boolean hasInvalidRequest(String encrypted) {
    String[] parts = new EncryptionDecryption(PUBLIC_KEY).decrypt(encrypted).split(",");
    String ts = parts[2]; // yyyyMMddHHmm
    if (ts.length() != 12) return true;
    int nowDay = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
    int reqDay = Integer.parseInt(ts.substring(0, 8));
    if (nowDay > reqDay) return true;
    int nowMin = Integer.parseInt(new SimpleDateFormat("HHmm").format(new Date()));
    int reqMin = Integer.parseInt(ts.substring(8));
    return (nowMin - reqMin) > ConfigUtil.getInt("valid_request_minutes");
}

有效期放配置文件,靈活調整。

序列圖

時序圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved