最可靠方法是用 hdiutil create -type sparsebundle -fs apfs -volname "securefolder" -encryption aes-256 -agentpass 创建加密 apfs 稀疏束,配合 chmod 600 锁定映像文件、设置 com.apple.finderinfo 隐藏锁定标志,并卸载后清理钥匙串密钥。

用 hdiutil 创建加密 APFS 映像最可靠
macOS 12+ 推荐用 APFS 格式而非旧的 HFS+,它原生支持文件级加密、快照和更细粒度的权限控制。用 hdiutil 命令行创建比磁盘工具 GUI 更可控,尤其适合脚本化或避免 GUI 意外选错格式。
执行前确认目标文件夹路径无空格或特殊字符(或用引号包裹),且你有该路径的读取权限:
hdiutil create -type SPARSEBUNDLE -fs APFS -volname "SecureFolder" \ -encryption AES-256 \ -agentpass \ ~/Desktop/SecureFolder.sparsebundle
-
-type SPARSEBUNDLE:生成稀疏束(可动态增长,比固定大小映像更实用) -
-encryption AES-256:必须显式指定,否则默认不加密;none或省略即明文 -
-agentpass:触发钥匙串弹窗输入密码,避免密码出现在 shell 历史或进程列表中 - 生成后不会自动挂载,需手动双击或运行
hdiutil attach
挂载后修改 .sparsebundle 的 ACL 权限要谨慎
APFS 映像本身是只读容器,其内部卷的权限由挂载后的卷宗(Volume)决定;但映像文件(如 SecureFolder.sparsebundle)自身的文件系统权限也影响能否被其他用户挂载或篡改。
常见错误是仅改了卷内文件权限,却忘了锁住映像文件本身:
- 禁止他人读取映像文件:
chmod 600 ~/Desktop/SecureFolder.sparsebundle - 禁止他人执行挂载操作(即使有读权限也不行):
chmod 600 ~/Desktop/SecureFolder.sparsebundle/token(如果存在) - 若需限制特定用户访问,用
chmod +a "user:alice:deny:read,write,execute"添加 ACL 规则 - 注意:
chown改属主对稀疏束无效——APFS 映像元数据归 root 管理,普通用户无法chown成功
挂载时自动应用用户权限的关键是 com.apple.FinderInfo
即使映像内文件设置了 chmod 700,Finder 仍可能因未识别权限上下文而允许其他用户“打开”映像(只是进不去内容)。真正起作用的是映像 bundle 的扩展属性:
xattr -wx com.apple.FinderInfo \
$(printf "%08x%08x%08x%08x%08x%08x%08x%08x" \
0 0 0 0 0 0 0 80000000) \
~/Desktop/SecureFolder.sparsebundle
其中末尾的 80000000 表示「隐藏并锁定」标志位。这个设置会让 Finder 把它当系统级敏感项处理,配合 chmod 600 后,非属主用户双击会直接提示“您没有权限打开此文档”。
该属性不会影响命令行挂载,所以仍需靠 hdiutil attach -owners on 显式启用挂载时的权限继承。
卸载后彻底清除内存中的解密密钥残留
macOS 在挂载加密映像后,密钥可能短暂缓存在内核密钥环(keychain)或内核内存中。单纯拖出卷宗或 hdiutil detach 不保证密钥立即释放。
- 卸载后立刻运行:
security find-generic-password -s "com.apple.diskimages.<code>xxhash" -w 2>/dev/null | xargs -I{} security delete-generic-password -s {}(需先用hdiutil info查到实际 hash) - 更稳妥的做法:卸载后重启钥匙串访问(在活动监视器里强制退出
SecurityAgent进程) - 若在共享 Mac 上使用,务必禁用“登录时自动挂载”——该选项会把密码存入登录钥匙串,且默认允许所有钥匙串项目访问
APFS 加密映像的安全边界不在“能不能打开”,而在“谁能在挂载后看到什么”。很多问题其实源于混淆了映像文件权限、挂载时权限策略、以及 Finder 层面的 UI 隐藏逻辑——三者缺一不可。










