讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

c++如何编写一个安全的文件彻底粉碎工具_多次数据覆写【详解】

胖伟小哥_8122

胖伟小哥_8122

发布时间:2026-03-29 14:15:30

|

377人浏览过

|

来源于php中文网

原创

安全粉碎不能仅靠std::ofstream写0x00,因缓存、SSD磨损均衡等导致覆写失效;必须用底层同步写入(如O_SYNC或FILE_FLAG_WRITE_THROUGH)、对齐扇区、调用fsync/FlushFileBuffers,并按设备类型选择策略:机械盘可3次覆写(含真随机),SSD应触发TRIM/安全擦除,加密卷直接销毁密钥。

c++如何编写一个安全的文件彻底粉碎工具_多次数据覆写【详解】

为什么 std::ofstream 直接写 0x00 不等于安全粉碎

操作系统和硬盘固件会缓存、延迟写入,甚至把“覆写”变成逻辑删除;SSD 还有磨损均衡和预留空间,你写的块可能根本没碰原始数据。所以光靠 C++ 文件流反复 write() 没用,必须配合底层控制——比如打开文件时加 O_SYNC(Linux)或 FILE_FLAG_WRITE_THROUGH(Windows),并确保每次写都真正落盘。

  • Linux 下用 open() + O_WRONLY | O_SYNC,再用 write() 和 fsync(),比 std::ofstream 更可控
  • Windows 下必须用 CreateFile() 启用 FILE_FLAG_WRITE_THROUGH 和 FILE_FLAG_NO_BUFFERING,否则绕不开系统缓存
  • 覆写前先调用 SetEndOfFile()(Win)或 ftruncate()(Linux)确保文件长度不变,避免扩容导致旧数据残留

三次覆写够不够?看设备类型和合规要求

DoD 5220.22-M 要求 3 次(0x00、0xFF、随机字节),但这是针对老式机械硬盘的统计模型;对 SSD,任何基于覆盖的方案都不可靠——TRIM 和 GC 会让覆写失效。所以 C++ 工具里硬编码“覆写 3 次”只是心理安慰,实际应分场景处理:

  • 机械硬盘:3 次可接受,但第 3 次务必用真随机字节(std::random_device + std::mt19937),别用 rand()
  • SSD/NVMe:优先调用 ioctl(..., BLKSECDISCARD)(Linux)或 IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES(Win)触发安全擦除命令
  • 加密卷(如 BitLocker、LUKS):直接销毁密钥比覆写快得多也更彻底,C++ 可调用 cryptsetup luksKillSlot 或 Windows Manage-Bde 等外部命令

std::filesystem::remove() 之后还能恢复?是的,而且很常见

std::filesystem::remove() 只删元数据,不碰数据区。只要没被新文件覆盖,用 photorec 或 debugfs 几分钟就能找回。安全粉碎必须在 remove() 前完成所有覆写,并且最后一步要填满整个文件分配单元(比如对齐到 4KB 扇区边界)。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 用 std::filesystem::file_size() 获取真实大小,但覆写长度必须向上对齐到存储设备的物理扇区大小(通常 4096 字节)
  • 不要依赖 seekp() 跳转后 write(),某些文件系统(如 exFAT)在稀疏写时不会真正分配簇
  • 覆写完成后立即调用 std::filesystem::remove(),中间不 sleep、不 log、不抛异常——避免进程崩溃导致残留半覆写文件

跨平台实现时最常漏掉的三件事

Windows 和 Linux 对“同步写入”的语义差异极大,很多 C++ 实现只测了 Linux 就上线,结果在 NTFS 上完全失效。

立即学习“C++免费学习笔记(深入)”;

  • Linux 必须检查 write() 返回值是否等于请求长度,并在循环中重试;fsync() 失败要 abort,不能忽略
  • Windows 下 WriteFile() 配合 FILE_FLAG_NO_BUFFERING 时,缓冲区地址和写入长度都必须是扇区对齐的(VirtualAlloc() 分配 + GetDiskFreeSpace() 查扇区大小)
  • 所有路径操作必须用 std::filesystem::path,避免硬编码 "\" 或 "/";特别注意长路径(>260 字符)在 Windows 需要 \? 前缀,而 std::filesystem 默认不加
事情说清了就结束。真正难的不是写几次 0x00,而是让每次写都落到物理介质上,且不被固件、驱动、文件系统悄悄绕过。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3479

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3038

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1548

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2739

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3370

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1737

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

2537

2023.08.28

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

5507

2023.08.30

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn