Java 如何防止外部xml文件修改?

Java 如何防止外部xml文件修改?,java,xml,security,file-io,Java,Xml,Security,File Io,我正在编写一个小库,它将处理xml文件以存储一些数据,我需要仅通过我在库中提供的方法来处理这些数据 我知道xml对人和机器都是可读的,如果有人真的想修改xml文件,他可能会这样做,所以。。。你们有没有一个可行的想法?你们可以在其中存储更多信息,比如内容的散列(当然是在插入散列之前) 重新加载此文件时,可以检查哈希。如果它与文件的当前哈希不匹配,那么它已被修改。您可以在其中存储更多信息,例如内容的哈希(当然是在插入哈希之前) 重新加载此文件时,可以检查哈希。如果它与文件的当前哈希不匹配,那么它已被

我正在编写一个小库,它将处理xml文件以存储一些数据,我需要仅通过我在库中提供的方法来处理这些数据


我知道xml对人和机器都是可读的,如果有人真的想修改xml文件,他可能会这样做,所以。。。你们有没有一个可行的想法?

你们可以在其中存储更多信息,比如内容的散列(当然是在插入散列之前)


重新加载此文件时,可以检查哈希。如果它与文件的当前哈希不匹配,那么它已被修改。

您可以在其中存储更多信息,例如内容的哈希(当然是在插入哈希之前)


重新加载此文件时,可以检查哈希。如果它与文件的当前哈希不匹配,那么它已被修改。

那么,没有确定的方法阻止对该文件的访问。但是,您可以使用几种方法来增加手动覆盖文件的难度

您可以做的第一件事是在应用程序运行期间锁定文件(需要确保操作系统兼容性)。任何人都可以绕过操作系统文件锁定,但对于普通用户来说,这并不是小事


第二,您可以考虑在应用程序终止时对文件进行加密。恢复密钥可以通过应用程序代码检查来完成,但这也是一项非常重要的工作。

好的,没有确定的方法来阻止对该文件的访问。但是,您可以使用几种方法来增加手动覆盖文件的难度

您可以做的第一件事是在应用程序运行期间锁定文件(需要确保操作系统兼容性)。任何人都可以绕过操作系统文件锁定,但对于普通用户来说,这并不是小事


第二,您可以考虑在应用程序终止时对文件进行加密。恢复密钥可以通过应用程序代码检查来完成,但同样,这是一项非常重要的工作。

如上所述,您已经实现了一种检测文件更改的方法,并且希望找到一种防止这些修改的方法

通常,这是不可能的。我会在最后解释

您可以选择做什么:

  • 如果要在程序运行时防止修改,可以锁定文件。这将阻止应用程序访问它,但当程序退出时,锁将被释放。()
  • 如果要在程序未运行时阻止访问,则必须更改文件系统权限以禁止用户编辑文件。这要困难得多,因为它与文件系统相关,而且像FAT这样的一些文件系统根本没有文件权限
  • 您可以编写一个“守护进程”脚本,监视文件更改并将其还原
但所有这些可能性都有一个问题——程序通常与用户具有相同的权限,因此程序所做的一切都可以由用户撤消。如果您的程序具有访问权限,则用户也具有访问权限

如果您锁定了一个文件,用户可以使用类似Unlocker的工具来解除锁定,并对其进行编辑。如果您的程序设置了文件权限,用户只需重新更改即可。在某些系统上,可能会阻止这种情况,但您的程序也会失去访问权限。令人不快的如果编写守护进程,用户可以将其杀死

唯一的可能是让程序以比用户更多的权限运行,并将数据存储在用户也无权访问的地方。例如,在Windows上,您可以将其作为服务运行。这要求用户不具有管理员权限(在Unix系统上为root用户)


如果用户是admin或root,则您已经丢失,因为他拥有对系统的完全访问权限,您无法隐藏。(在Windows上,还有一个级别,即系统用户,但管理员用户也可以轻松获得这些权限)。

正如您前面所说,您已经实现了一种检测文件更改的方法,并且希望找到一种防止这些修改的方法

通常,这是不可能的。我会在最后解释

您可以选择做什么:

  • 如果要在程序运行时防止修改,可以锁定文件。这将阻止应用程序访问它,但当程序退出时,锁将被释放。()
  • 如果要在程序未运行时阻止访问,则必须更改文件系统权限以禁止用户编辑文件。这要困难得多,因为它与文件系统相关,而且像FAT这样的一些文件系统根本没有文件权限
  • 您可以编写一个“守护进程”脚本,监视文件更改并将其还原
但所有这些可能性都有一个问题——程序通常与用户具有相同的权限,因此程序所做的一切都可以由用户撤消。如果您的程序具有访问权限,则用户也具有访问权限

如果您锁定了一个文件,用户可以使用类似Unlocker的工具来解除锁定,并对其进行编辑。如果您的程序设置了文件权限,用户只需重新更改即可。在某些系统上,可能会阻止这种情况,但您的程序也会失去访问权限。令人不快的如果编写守护进程,用户可以将其杀死

唯一的可能是让程序以比用户更多的权限运行,并将数据存储在用户也无权访问的地方。例如,在Windows上,您可以将其作为服务运行。这要求用户不具有管理员权限(在Unix系统上为root用户)


如果用户是admin或root,则您已经丢失,因为他拥有对系统的完全访问权限,您无法隐藏。(在Windows上,还有一个级别,即系统用户,但管理员用户也可以轻松获得这些权限)。

我从讨论和您的问题中了解到,您希望将数据存储为xml,用户很难打开/修改它

在这种情况下,您必须做一些额外的工作:

  • 使用ha创建xml文件
    <!-- 0123456789abcdefabcdef0123456789 -->
    
    # Read
    secret  = "Secret key"
    file    = get_file_contents("file.xml")
    content = strip_trailing_comment(file)
    hash    = get_content_hash(file)
    if sha1(content + secret) == hash:
        # File is valid
    
    # Write
    secret            = "Secret key"
    content           = content_to_xml()
    hash              = sha1(content + secret)
    content_with_hash = append_comment(hash)
    write_to_file("file.xml", content_with_hash)