贝利信息

HTML5如何实现加密上传_HTML5加密上传实现路径【加密】

日期:2026-01-17 00:00 / 作者:雪夜
HTML5本身不提供加密上传能力,所谓“HTML5加密上传”实为前端用Web Crypto API(如AES-GCM)在上传前对文件加密,再通过fetch等发送密文及IV、salt、authTag等元数据。

HTML5 本身不提供加密上传能力

HTML5 标准里没有 encryptFile()cryptoUpload() 这类 API, 拿到的 FileBlob 是明文二进制数据,浏览器不会自动加密。所谓“HTML5 加密上传”,本质是:前端用 JavaScript 在上传前对文件内容做加密(如 AES),再把密文通过 fetchXMLHttpRequest 发给后端。

用 Web Crypto API 在浏览器端 AES 加密文件

现代浏览器支持 window.crypto.subtle,可安全生成密钥、执行 AES-GCM(推荐,带认证)。注意:密钥不能硬编码,也不能从服务端直接下发明文密钥——应由用户输入派生(如 PBKDF2 + password)。

cons

t encoder = new TextEncoder(); const password = "user-input-passphrase"; const salt = crypto.getRandomValues(new Uint8Array(16)); const key = await crypto.subtle.importKey( "raw", await crypto.subtle.deriveKey( { name: "PBKDF2", salt, iterations: 100_000, hash: "SHA-256" }, await crypto.subtle.importKey("raw", encoder.encode(password), { name: "PBKDF2" }, false, ["deriveKey"]), { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"] ), { name: "AES-GCM" }, false, ["encrypt"] ); const iv = crypto.getRandomValues(new Uint8Array(12)); const encrypted = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, key, await file.arrayBuffer());

上传时如何携带加密元数据

后端需要知道用了什么算法、IV、盐值、认证标签才能解密。不能拼接在文件头(破坏 MIME 类型),推荐用 FormData 多字段提交:

常见翻车点:跨域、MIME、解密失败

即使前端加密逻辑正确,上传仍可能失败:

加密不是银弹。如果服务器本身不可信,或用户设备已中毒,前端加密意义有限。重点其实是明确威胁模型:你防的是传输窃听?还是中间存储泄露?还是运维人员越权访问?每种场景对应不同设计取舍。