HTML5无法加密文件元信息,因下载依赖HTTP响应头明文传递;实际应通过服务端动态命名、权限校验、Token化ID等方式控制访问,前端仅安全触发受控下载。
HTML5 本身不提供直接加密文件元信息(如文件名、大小、MIME 类型)的机制,所谓“下载元信息加密”本质上是一种误解或营销话术。浏览器在下载过程中必须解析并暴露部分元信息才能完成下载,这是由 HTTP 协议和浏览器安全模型决定的,无法绕过。真正可做的是混淆、延迟暴露或服务端控制访问权限,而非前端加密元数据。
下载行为依赖 HTTP 响应头(如 Content-Disposition、Content-Type、Content-Length),这些字段由服务器生成,浏览器按规范解析并用于展示下载对话框。即使使用 或 ,文件名仍由 JS 指定或从响应头继承——它始终是明文传递给浏览器的,不存在加密解密环节。
fetch + Blob + URL.createObjectURL
虽然不能加密元信息,但可通过以下方式降低敏感信息泄露风险:
7a2f1e8b.pdf 而非 工资单_张三_2025Q2.pdf),并在响应头中设置 Content-Disposition: attachment; filename="7a2f1e8b.pdf"
强制指定名称,避免暴露原始路径或参数;注意该属性仅对同源 URL 生效Cache-Control: no-store, no-cache 防止中间代理缓存原始头信息?file=report_secret.pdf 这类直连方式,改用 POST 请求或 Token 化 ID(如 /download?id=abc123,服务端查表映射真实资源)某些方案声称“用 Web Crypto API 加密文件名再解密”,实则无效:解密逻辑必然暴露在前端 JS 中,攻击者可调试获取密钥和原始名;还有方案用 canvas 渲染文字再转 Blob 下载,不仅破坏可访问性,且文件内容未加密,元信息(如 Blob 对象的 type/size)依然可见。这类做法徒增复杂度,反而引入兼容性与维护隐患。
真正的安全边界在服务端——控制谁可以请求、何时失效、返回什么内容。前端只负责安全地触发受控下载,别试图“加密看不见的东西”。