我有一个程序解密zip文件,将其解压缩到一个秘密位置,然后在解压缩的文件夹中运行程序。我想确保没有外部程序可以将提取文件夹复制到另一个位置(程序完成时删除秘密文件夹)。
我已经通过使我的解密程序成为“永远在线”程序来删除Windows资源管理器,如果它被杀死(通过使用解密程序启动的另一个隐藏程序),它将删除秘密文件夹。我担心的是另一个程序可以查看进程列表,发现文件夹位置并执行复制。
有没有办法阻止程序化复制文件的目录?如果没有?
答案 0 :(得分:3)
查看Directory.CreateDirectory(string,DirectorySecurity)
您需要创建一个封装所需权限集的DirectorySecurity
对象。最简单的方法是使用所需的权限集创建进程'userid所拥有的模型目录(例如,“只有我可以遍历此目录或查看甚至打开其中的任何内容。”)。完成后,使用DirectorySecurity
构造函数重载DirectorySecurity(String, AccessControlSections)
来实例化具有相同权限的DirectorySecurity
对象。
当然,另一种方法是创建与上面相同类型的“模型目录”,并创建“秘密”工作目录作为其子目录,继承父级的权限集。
至于安全删除磁盘上的内容,请查看问题“Shredding files in .NET”
如果信息是敏感的,您可能应该将其解密到内存而不是磁盘。但你应该意识到这也不安全。最近数据泄露Target的POS系统遭受的损失是由于定制设计的恶意软件收集了纯文本信用卡和来自进程内存的其他PCI /敏感数据。
答案 1 :(得分:1)
为此,您需要设置共享模式。不确定C#解决方案,但据我所知,在C#中您可以使用Win32,因此您需要使用CreateFile打开该文件夹中的文件并将dwShareMode
设置为零。
此外,如果您想在程序终止后删除所有内容,可以使用FILE_FLAG_DELETE_ON_CLOSE
标记。
正如我所提到的,不确定使用C#是否容易做到这一点,但你总是可以信任C ++,它可以让你做更低级别的事情。
答案 2 :(得分:0)
从用户上下文运行时,文件系统始终是公共的。
您总是可以尝试将“文件夹”提取到二进制流 - 并在文件系统上创建一个原始的二进制文件,这个文件没有明显的意义 - 例如制作自己的临时“文件系统”
答案 3 :(得分:0)
简短回答:你不能。
您可以做的最好的事情是创建一个用户帐户,并限制只读取您的文件/目录的权限。当然,管理员仍然可以访问它。