【问题标题】:What means "Verifies the write" when erasing hdd's?擦除硬盘时“验证写入”是什么意思?
【发布时间】:2017-04-29 17:12:15
【问题描述】:

我正在查看一些用于(安全)擦除硬盘的代码。我注意到在查看不同方法(Infosec 5DoD 5220.22-M 等)时,我读到了“验证写入”。

例子:

https://www.lifewire.com/dod-5220-22-m-2625856

Pass 3:写入一个随机字符并验证写入

https://en.wikipedia.org/wiki/Infosec_Standard_5#cite_note-5

无论使用哪个级别,都需要验证以确保 覆盖成功。

我的问题是,它技术意味着什么?

  1. 当你写入一个数据块时,你是否只检查写入的字节是否等于块的大小(似乎很快)?

  2. 您是否回读您写入的块并比较(memcmp?)是否与写入的数据块完全相同?

  3. 还有其他我忽略的解决方案吗?

这里有一些示例代码来说明我的问题。哪个解决方案会指示“写时验证”?如果您只检查返回值(来自write)可以您确定,只要匹配所有字节确实写入的块的长度?

// erasure example
// erasure single block, start from 0

// block size
unsigned long block_size = 512;

// data-block we will write
char block[block_size];

// zero the block
bzero(&block, block_size);

// open device
int fd = open('/dev/sdb', O_RDWR);   

// write 1st block
int bytes_written = write(fd, &block, block_size);  

// verify option: A
if (bytes_written == block_size) {
    // all good
}

// verify option B
// go back the number of bytes-wtitten from the current pos.
lseek(fd, -1 * bytes_written);
// read the same number of bytes
int bytes_read = read(fd, &block, bytes_written);  

// should be same
if (bytes_read == bytes_written) {
    // here code to check i block indeed contains zero's    
    // use memcmp ?
}

【问题讨论】:

    标签: c io hard-drive


    【解决方案1】:

    擦除硬盘时“验证写入”是什么意思?

    来自Here

    write(...) 函数尝试将 nbytes 从缓冲区写入 与句柄关联的文件。在文本文件上,它将每个 LF 扩展为 CR/LF。

    函数返回写入文件的字节数。回报 值为 -1 表示错误,并适当设置了 errno。

    所以在你的例子中,int bytes_written = write(fd, &block, block_size); bytes_written 的值,如果等于块大小,验证块的所有内存位置都已写入。

    并回答您的其他问题:

    • (1) 始终检查非 void 函数的返回值,并且通过简单地比较两个 int 值没有明显的效率或速度损失。您甚至可以一步完成,但我不确定这是否会提高效率(查看程序集以确认)。所以而不是:

      // verify option: A
      if (bytes_written == block_size) { // all good }

      //可以在同一行进行比较:

      if(write(fd, &block, block_size) == block_size) { // all good }

    • (2) 可选。它提供了一个额外的验证内存块包含新的内容。

    您可以在 this Linux man page 中找到关于 write() 的更详细说明。

    【讨论】:

    • 谢谢,我的意思是,返回值(如果 block_size == write(...))是否符合擦除规范的要求。
    • @Rogier - 是的,任何一种方法,if(block_size == write(...))if(bytes_written == block_size) 都清楚地表明 (validation) 已经进行了 更改 .诸如memcmp(...) 之类的其他步骤只会提供额外的验证,并且对于您的目的是完全可选的,IMO。我已经修改了我的答案,试图让这些想法更清楚。
    • @Rogier - 我很好奇你的头像是Thunder Mustang,还是一架完整的二战飞机?
    • 我不确定,我在某个地方捡到了它:o 我认为它是 P51(完整)。我确实有我的 PPL。 P51 在我的遗愿清单上!你飞了一个实验/套件?
    • @Rogier - 酷。是的,我愿意。刚卖了一辆塞斯纳,想购买一辆部分建造的 RV-8。
    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多