-1

假设我想实现一个一次性垫。假设我有一个安全的随机数生成器,并且我创建了一个带有随机数的一次性便笺簿。假设我想将其保存在 USB 记忆棒或文件系统上的某个空间上。

现在我有一个脚本或程序,可以接收一条消息并使用存储的一次性密码器加密或解密该消息。完成此操作后,我想尝试以编程方式销毁一次性垫。

你会怎么做?我知道仅仅删除文件是不够的,因为数据仍在磁盘上。用 0 或其他日期覆盖一次性填充是否足够。是否会使其真正无法恢复。

还需要将焊盘读入 RAM 和一些阶段来进行模运算。确保 RAM 也不再可恢复的最佳做法是什么?

一次性垫真的可以用软件实现吗?在考虑如何实施一次性垫时,我还缺少哪些其他因素?

4

2 回答 2

3

我不是专家。这是我的想法。

双方之间的一次性垫要求双方使用相同的垫。对于各方之间交换的每条消息,每一方将从垫中删除一个“页面”。在软件的情况下,“页面”是加密密钥。由于可能会发生错误,因此您需要做一些事情才能使其正常工作:

  1. 您需要一种方法让各方同步他们所在的“页面”。通常在消息交换过程中,双方只知道使用哪个页面(当前页面),但如果他们不同步,他们需要决定使用哪个页面。

  2. 当一个垫子用完时,各方需要决定是时候使用下一个垫子了。就像页码一样,他们只需要一种方式来表示“使用新垫”。

  3. 双方似乎可能需要一种方法来确定他们使用的是同一个垫。您可能想要一种方法来做到这一点,而无需在便笺簿中烧毁页面;这似乎是正确的,但可能不是必需的。

  4. 删除垫子(或垫子中的页面)很棘手。您将不得不阅读经典的“如何擦除驱动器以使 nsa 无法恢复它”的内容。我认为这涉及将不同的垃圾重复写入磁盘上的相同扇区。

  5. 记住永远不要使用相同的“页面”两次。请求的页面与响应请求的页面不同。

于 2013-09-23T16:10:10.387 回答
0

内存

物理方式

关闭电脑会在一小段时间后将其删除。在几秒钟/几分钟内,RAM 可能会受到冷启动攻击,但随后数据将在物理上消失。

程序化方式

/*C code*/ 

//Ask OS for some ram, the size of our data.
char * SensitiveData = malloc(myDataSize); 

//Copy data from hard drive to the ram memory we
//...just allocated. Implement this function your own way.
load_key_from_hardrive(SensitiveData); 

/*Use key here*/ 

//Now let's overwrite the key:
for (i=0;i<myDataSize;i++)
{
   SensitiveData[i]='\0'; //Fill it with zeros.
}

free (SensitiveData); //Give the memory back to the OS.

硬盘

物理方式

将密钥保存在 USB 记忆棒上,然后物理销毁它将保证密钥被移除。

程序化方式

有很多方法。这是 Linux 的一个:创建一个新分区,将密钥放在那里。记下分区号,在本例中为sda2.

为了摆脱密钥,零填充分区:

#Linux bash code
dd if=/dev/zero of=/dev/sda2 bs=1M

如果您更喜欢填充随机数据以进行否认,请使用:

#Linux bash code
dd if=/dev/urandom of=/dev/sda3 bs=1M

其他注意事项

一次零填充柱塞就足够了。零填充现代硬盘驱动器一次可能就足够了,但有些人不止一次这样做。

一些操作系统将磁盘 I/O 缓存在 RAM 中,为了安全起见,在擦除硬盘后,您还应该使用Ram > The physical way。我在这里可能太偏执了。我对 IO 缓存没有深入的了解,也许其他人会更好地编辑本节。

如果可以使用其他一些 RAM 内存来推断密钥,请确保以与Ram 类似的方式将它们填零 > 编程方式

于 2014-06-11T19:40:31.113 回答