您使用的大海捞针方法正是我对 TrueCrypt 所做的。闪存棒上的一个目录中大约有 600 个密钥文件,其中大约有 10 个被使用。
闪存棒有一个硬件只读开关,可防止操作系统更新“上次访问”元数据。如果您使用可写介质进行存储,请记住这一点 - 您访问的关键文件将(很可能)在访问日期之前泄露。我还通过随机化文件上的创建/修改/访问日期为此添加了一些额外的“箔条”,以使所有日期完全不可信。
这使得找到正确的密钥文件变得非常困难 - 1,545,269,050,000,000,000,000 个潜在组合,假设从 600 个文件中选择了 10 个,如果顺序无关紧要并且任何一个密钥文件只能使用一次。每个组合都必须尝试潜在的密码,使这种蛮力完全不可行。只要您使用足够大小的随机密钥文件(我通常使用 4kB 或更大),也没有可行的方法来暴力破解内容。密钥(通常)由文件内容的哈希生成,或者如果使用多个密钥文件,则这些哈希的组合与密码的哈希相结合。请注意,“哈希”可能意味着像 SHA256 这样的简单哈希,或者像 PBKDF2 或 bcrypt 这样的密钥派生算法的输出。因此,在没有密钥文件的情况下计算密钥是不可能的。相反,不可能从卷中识别密钥文件,因为您需要知道密钥才能推断出这样的事情。
为了解决 fatfredyy 评论中提到的潜在缓存定时攻击 - 这是极不可能的。提议的攻击涉及读取各种文件并比较它们的访问时间。最近读取的文件应该阅读速度比其他人快,因为它会在缓存中。但是,从磁盘读取的时间在硬盘上很嘈杂(来自未知当前扇区的查找时间使事情变得有趣)并且访问缓存具有海森堡效应 - 读取文件可能会将其加载到缓存中,并可能破坏缓存的完整性就潜在的定时攻击而言。SSD 上也会出现类似的问题,它使用相对较少的读取缓存和大量的写入缓存。在某些系统中,您可能会发现顺序读取目录中的文件会导致后面的文件被预取,从而使时序攻击更加复杂。如果没有从驱动器中物理提取硬件缓存数据,我认为这是不可行的。