浏览器端使用Javascript检测上传的PST等文件是否为密码保护状态
浏览器端通过JS检测PST文件是否加密的实现方案
结论
可以实现,不需要上传文件到服务端,仅通过解析PST文件头部的固定标识就能完成判断,性能开销极低,适合前端预校验场景。
实现原理
PST是微软Outlook专属的邮件数据存储格式,其文件头部固定位置存储了加密状态标识:
- 偏移量
0x1A00位置的4个字节为加密类型字段,值为0代表文件未加密,非0值则代表已启用密码保护 - 仅需要读取文件前7KB(7168字节)的内容即可获取该标识,不需要解析整个PST文件
核心实现代码
// 检测PST是否加密的工具函数 async function isPstProtected(file) { // 仅截取头部足够覆盖标识位的内容,减少性能消耗 const headerSlice = file.slice(0, 7168); const buffer = await headerSlice.arrayBuffer(); const dataView = new DataView(buffer); // PST文件采用小端序存储,读取0x1A00位置的32位无符号整数 const encryptFlag = dataView.getUint32(0x1A00, true); return encryptFlag !== 0; } // 绑定上传事件调用 const uploadInput = document.querySelector('input[type="file"]'); uploadInput.addEventListener('change', async (e) => { const targetFile = e.target.files[0]; if (!targetFile?.name.toLowerCase().endsWith('.pst')) return; const hasPassword = await isPstProtected(targetFile); console.log('是否加密:', hasPassword); if (hasPassword) { // 触发你的加密提示逻辑 } })
注意事项
- 该方案仅能判断文件是否启用了密码保护,无法校验密码正确性,也无法破解加密内容
- 仅对微软标准格式的ANSI、Unicode PST文件有效,部分第三方工具生成的非标PST可能存在识别误差
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

