我正在编写一个安全的文件管理程序,我有一个问题。
那么,假设用户从外部磁盘选择并加密一个文件(如Test.mp3 ),并且在磁盘上创建Test.lock文件。现在,如果用户想解密Test.lock文件,那么在磁盘中重置一个Test.mp3文件是危险的,我们不希望Test.mp3文件留在磁盘中,第一个解决方案是在内存中解密test.mp3,但是这个想法适用于小文件,现在我的问题是,当文件很大时,我不能将它们全部保存在内存中,是否有一种方法可以不将其写入磁盘而运行Test.mp3?
我的意思是,.mp3扩展是一个假设,它可以是任何其他的延伸。加密算法,没关系,我在找一个主意,有人能帮我吗?
发布于 2020-09-15 10:50:58
你要寻找的是即时解密(如果用户也想修改文件的话)。一方面,.NET中的大多数加密是通过硬编码以返回CanSeek为false的CryptoStream实现的;另一方面,如果使用支持随机存取解密的块密码,则可以通过加密文件(即立即跳转到块而不解密前一个块)来查找加密文件,例如,您可以使用7 GB加密视频文件,一次只解密一次所需的几个字节,以便用户立即播放,甚至在不解密整个内容的情况下跳过视频。不需要大内存或临时文件。
问题是,虽然允许在定制的CryptoStream派生中查找,但结果流只能通过应用程序读取。您可能可以在自己的应用程序中设置一个解密识别的文件类型播放/显示文件流,但是您必须支持所有的文件类型。
相反,像VeraCrypt、Cryptomator和BitLocker这样的应用程序创建一个虚拟驱动器来拦截诸如“给我文件A.MP3的7-13字节”这样的调用,从而转换成一个解密调用,并返回适当的解密字节(反之亦然)。你不再是步履蹒跚的支持每种文件类型,它与任何用户的第三方应用程序兼容,以处理他们像一个正常的文件在一个真正的驱动器。要做到这一点,需要编写无法在C#上完成的低级驱动程序。
如果您想知道为什么在似乎将每个文件捕获到自己的容器中时需要创建一个完整的虚拟驱动器,那么对文件的修改可能会在文件系统中留下部分已删除或旧的块,这可以被对手用来攻击加密。因此,您不能在应用程序中使用"Test.lock“范式。相反,它将是一个挂载的虚拟驱动器/目录。密码技术的结合(因为您不再使用内置库)、实现低级别驱动程序的困难以及内置BitLocker、免费和经过审计的VeraCrypt的存在意味着另一种加密解决方案成功的可能性很小。
https://stackoverflow.com/questions/63898702
复制相似问题