【发布时间】:2010-08-24 21:13:40
【问题描述】:
我正在编写一个小库,它将处理 xml 文件以存储一些数据,并且我需要仅通过我在库中提供的方法来处理这些数据。
我知道 xml 对人和机器都是可读的,如果有人真的想修改 xml 文件,他可能会这样做,所以......你们有没有一个可行的想法?
【问题讨论】:
-
将文件设为只读? chmod 444?
-
我在想一些对用户来说更难破解的东西
我正在编写一个小库,它将处理 xml 文件以存储一些数据,并且我需要仅通过我在库中提供的方法来处理这些数据。
我知道 xml 对人和机器都是可读的,如果有人真的想修改 xml 文件,他可能会这样做,所以......你们有没有一个可行的想法?
【问题讨论】:
您可以在其中存储更多信息,例如内容的哈希(当然是在插入哈希之前)。
当您重新加载此文件时,您可以检查哈希。如果它与您文件的当前哈希不匹配,那么它已被修改。
【讨论】:
嗯,没有明确的方法来阻止对该文件的访问。但是您可以使用多种措施来使手动覆盖文件变得困难。
只要您的应用程序正在运行,您可以做的第一件事就是锁定文件(需要确保操作系统兼容性)。任何人都可以绕过操作系统文件锁定,但对于普通用户来说并非易事。
其次,您可以考虑在应用程序终止时加密文件。可以通过应用程序代码检查来恢复密钥,但同样需要付出巨大的努力。
【讨论】:
如上所述,您已经实现了一种检测文件更改的方法,并且您想要一种方法来防止这些修改。
通常,这是不可能的。我会在最后解释。
你有几种选择:
但是所有这些可能性都有一个问题 - 程序通常与用户具有相同的权限,因此程序所做的一切都可以由用户撤消。如果你的程序有访问权限,那么用户也有。
如果您锁定了一个文件,用户可以使用 Unlocker 之类的工具来释放锁定,然后进行编辑。如果您的程序设置了文件权限,用户可以简单地将它们改回来。在某些系统上,可能可以防止这种情况发生,但是您的程序也会失去访问权限。坏的。如果你写一个守护进程,用户可以杀死它。
唯一的可能是让程序以比用户更多的权限运行,并将数据存储在用户也无权访问的地方。例如,在 Windows 上,您可以将其作为服务运行。这要求用户没有管理员权限(或 root,在 Unix 系统上)。
如果用户是 admin 或 root,那么您就输了,因为他拥有系统的完全访问权限,您无法隐藏。 (在 Windows 上,还有一个级别,即 SYSTEM 用户,但管理员用户也可以轻松获得这些权限。
【讨论】:
将文件的哈希与密钥连接到文件末尾。类似于 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)
希望能消除潜在的误解。这样,如果您愿意,代码仍然是人类可读的,并且难以篡改。
【讨论】:
据我从讨论和您的问题中了解到,您希望将数据存储为 xml,并且用户难以打开/修改它。
在这种情况下,您将不得不做一些额外的工作:
有一个question on stackoverflow 告诉你如何用密码保护你的 zip 文件
请注意,在这种方法中,xml 文件甚至无法读取。
如果您希望文件可读,那么您可以为您的应用程序使用单独的用户 ID(unix 用户 ID 或 Windows 用户 ID)作为文件的所有者。并且只允许该用户修改文件,但这仍然不是 100% 的解决方案。
【讨论】: