下載加密 PDF 時,伺服器端需先解密再輸出,解密耗時導致下載極慢甚至逾時。
CipherInputStream 邊讀邊解邊寫。try (InputStream in = new FileInputStream(encFile);
CipherInputStream cis = new CipherInputStream(in, cipher);
OutputStream out = response.getOutputStream()) {
byte[] buf = new byte[8192];
int len;
while ((len = cis.read(buf)) != -1) {
out.write(buf, 0, len);
}
out.flush();
}
CipherInputStream 內部以緩衝區方式處理,記憶體佔用恆定。
配合 Content-Range、Accept-Ranges: bytes,前端可多執行緒下載,體感速度大增。
| 檔案大小 | 目標解密吞吐量 | 建議配置 |
|---|---|---|
| 10 MB | > 50 MB/s | AES-NI 硬體加速 + 串流 |
| 100 MB | > 100 MB/s | 混合加密 + Range + 快取金鑰 |
| 1 GB+ | > 200 MB/s | 分塊加密 + 並行解密 + CDN |
jcmd PID JFR.start 或 VisualVM 取樣 CPU,確認熱點在 Cipher.doFinal 或 KDF。-XX:+UseAES -XX:+UseAESIntrinsics 是否啟用(預設開啟)。