C语言中的安全文件删除

C语言中的安全文件删除,c,file-io,C,File Io,C语言中的安全文件删除 我需要用C安全地删除一个文件,下面是我要做的: 使用fopen获取文件句柄 使用lseek/ftell 根据当前时间/或文件大小获取随机种子 从循环向文件写入(大小)字节,每次迭代写入256字节 fflush/fclose文件句柄 重新打开文件,重复步骤3-6 10~15次 重命名该文件,然后将其删除 是这样做的吗?因为我在橡皮擦中读到名称“Gutmann 25 passs”,所以我猜25是文件被覆盖的次数,“Gutmann”是随机化算法?是的,事实上它覆盖了文件上的n个

C语言中的安全文件删除

我需要用C安全地删除一个文件,下面是我要做的:

  • 使用
    fopen
    获取文件句柄
  • 使用
    lseek
    /
    ftell
  • 根据当前时间/或文件大小获取随机种子
  • 从循环向文件写入(大小)字节,每次迭代写入256字节
  • fflush
    /
    fclose
    文件句柄
  • 重新打开文件,重复步骤3-6 10~15次
  • 重命名该文件,然后将其删除

  • 是这样做的吗?因为我在橡皮擦中读到名称“Gutmann 25 passs”,所以我猜25是文件被覆盖的次数,“Gutmann”是随机化算法?

    是的,事实上它覆盖了文件上的n个不同模式

    它是通过在整个过程中编写一系列35种模式来实现的 要擦除的区域

    模式的选择假设用户不知道 驱动器使用的编码机制,因此包括模式 专为三种不同类型的驱动器设计。用户 知道驱动器使用的编码类型只能选择那些类型 用于驱动的模式。具有不同编码的驱动器 机制需要不同的模式


    更多信息如下。

    如果没有操作系统的配合,您无法安全地执行此操作,而且通常情况下,即使在操作系统配合下,也无法做到这一点

    当您打开一个文件并写入时,无法保证操作系统会将新文件放在与旧文件相同的位置。即使是这样,您也不知道新写入是否会使用与以前相同的集群链

    即使这样,您也不确定驱动器是否因为某些错误而没有映射出磁盘块——将您主宰世界的计划留在一个标记为“坏”但仍然可读的块上


    ps-不再需要25x覆盖,在磁头跟踪不良的旧低密度MFM驱动器上需要25x覆盖。在现代GMR驱动器上,覆盖一次就足够了。

    @Martin Beckett是正确的;有“安全删除”这样的事情,除非你知道从硬盘到硬盘的所有硬件操作。(即使如此,我也不会打赌一个资金充足的攻击者在访问物理媒体的情况下可以恢复什么。)

    但是,假设操作系统和磁盘将重复使用相同的块,您的方案不起作用的原因更为基本:
    fflush
    通常不会向磁盘写入任何内容

    在大多数多任务操作系统(包括Windows、Linux和OS X)上,
    fflush
    仅将数据从用户空间缓冲区强制输入内核。然后,内核将自己进行缓冲,只在需要时写入磁盘

    例如,在Linux上,您需要调用
    fsync(fileno(handle))
    。(或者首先使用文件描述符。)OSX与此类似。Windows有
    FlushFileBuffers


    一句话:您描述的循环很可能只覆盖内核缓冲区10-15次,而不是磁盘上的文件。在C或C++中没有可移植的方法来强制数据到磁盘。为此,您需要使用一个依赖于平台的接口。

    Gutmann方法对于较旧的磁盘技术编码方案工作得很好,Gutmann方法的35次擦除方案不再需要,甚至Gutmann也承认这一点。参见:Gutmann方法:在Gutmann讨论差异的批评部分

    通常,最多进行几个随机过程就足以安全地删除文件(可能需要额外的归零过程)

    thc.org的安全删除包包含sfill命令,用于安全地擦除硬盘上的磁盘和inode空间。

    MFT(主文件表)类似于FAT(文件分配表), MFT保留记录:磁盘上的文件偏移量、文件名、日期/时间、id、文件大小,甚至文件数据如果文件数据位于记录的大约512字节的空白空间内,则1个记录大小为1KB

    注意:新的硬盘数据设置为0x00。(只需让您知道)

    假设您想要覆盖file1.txt OS MFT在记录中找到此文件偏移量。 您开始在二进制模式下用二进制(00000000)覆盖file1.txt

    您将100%覆盖磁盘上的文件数据这就是MFT在磁盘上具有文件偏移量的原因。 之后,您将重命名并删除它

    注意:MFT会将文件标记为已删除,但您仍然可以获取有关此文件的一些数据,即日期/时间:创建、修改、访问。文件偏移量、属性、标志


    这扼杀了我对硬盘工作原理的想象:完全是!,那么你认为解决方案是什么,如果有的话?@killercode用于与操作系统相关的部分,文件使用哪些磁盘块-然后你可以使用一个操作系统函数来告诉你哪些磁盘块被使用并可以覆盖它们。对于磁盘上的坏块映射,尤其是在具有磨损均衡功能的SSD上,唯一安全的删除是一个非常大的锤子@扼杀了我对硬盘工作原理的想象——简单来说,这是正确的,但文件系统和磁盘可以在幕后进行大量优化。“目前没有私人数据恢复公司声称它可以重建完全覆盖的数据。”-我在一家数据恢复公司工作,虽然我们永远不会说我们可以恢复一个文件,直到它被恢复,但有时我们能够恢复部分文件,有时甚至是整个文件。这个过程是时间密集型的,但我们有一些程序,将有助于一些高概率排列的文件。我承认,如果文件被覆盖或因头部崩溃而损坏,我们可能90%的时间无法恢复任何使用的文件。请注意,至少您必须打开文件进行更新。但即使这样,也不能保证更新的扇区会写回同一位置。(事实上,几乎是肯定的
    1- create folder in c:\  and move file and in same time rename in to folder( use rename function ) rename file to 0000000000 or any another without extention 
    
    2- overwrite file with 0x00 and check if file was overwrited
    
    3- change date/time
    
    4- make without attributes
    
    5- leave file size untouched OS faster reuse empty space.
    
    6- delete file
    
    7- repeat all files (1-6)
    
    8- delete folder
    
    or
    
    (1, 2, 6, 7, 8)
    
    9- find files in MFT remove records of these files.