Java 设置文件夹所有者以便只有程序可以访问它

Java setting folder owner so only the program have access to it

我有一个加密程序,我正在寻找一种方法,以便只有加密程序才能访问它们的密钥文件夹。但是将它设置为所有者或用户中的任何人都不是一个好主意。我在想也许像 Steam 那样处理它的文件夹。它甚至限制对计算机 owner/admin 的访问,只有 Steam 应用程序可以 communicate/edit/access 文件夹。我想知道如何在 Java.

中做到这一点

我现在的代码是这样的

Path file = Paths.get("F:\keys\pic.datakey");
UserPrincipal owner = file.GetFileSystem().getUserPrincipalLookupService()
        .lookupPrincipalByName("username");
Files.setOwner(file, owner);

其中 keys 是文件夹名称,pic.datakey 是我试图阻止除程序以外的任何人访问的密钥。

How to set the folder owner to the encryption program's?

加密程序不是主体。它不能拥有东西。你需要的是运行程序作为一些特殊的主体1.

问题:

  1. 你应该使用什么主体?对此不会有独立于平台的答案。事实上,没有明显的特定于平台的答案,至少对于 Linux.

  2. 如何确保加密程序运行s为指定主体。这在 Java 中无法解决。 (长话短说......但是像 UNIX setuid 这样的机制将需要一个非 Java(非 shell)启动器来为 Java 程序安全地实现它们。)

但是一旦完成这些操作,就没有必要更改文件的所有者(根据您的代码)。所有者将默认为程序当前 运行.

所依据的主体

但这才是真正的问题。您认为通过对加密文件的用户隐藏加密密钥会达到什么目的?

如果我们假设用户具有完整的 "root" 访问权限(或同等权限),那么他们可以直接(即以根用户身份)或通过一些额外的努力访问存储在系统本地的任何文件。当然是在典型的操作系统上。

另一方面,如果用户没有 "root"(或同等)访问权限,您可以通过设置文件的所有者/权限来阻止他/她查看文件。添加加密并没有带来更多好处。

Yes it's a security measure.

针对什么安全?拥有机器的用户?即使假设它在技术上是可行的,这样做是否合理?

(这些都是反问。我提出这些问题是为了让你思考,不是因为我同意或不同意你在做什么。也不是因为我想辩论这个问题。)


1 - 假设程序 运行s 作为用户。首先,用户不能将其文件的所有权转让给另一个用户。这将为 "cheat" 文件使用情况统计提供一种简单的方法。您的加密程序 运行ning 作为用户也不能这样做。 (OS无法确定操作的意图。)其次,假设普通用户可以更改文件的所有者,那么在所有权变更后,用户将无法阅读它。而且,加密程序也不行。