当用户使用我的应用程序打开来自其计算机以外的源的文件时,您将如何实现向用户显示警告的功能?
这是Visual已经具有的特性:

我正在考虑将用户的一些系统信息作为哈希代码添加到文件中,但这并不安全,因为如果其他人能够访问“受害者”在其系统上创建的任何文件并查看系统ID哈希,然后创建一个文件并对其进行修改以包含此系统哈希,则该信息并不安全。
我的另一个选择是将文件的哈希与系统信息一起存储为单个哈希,并添加此哈希,而不是仅添加系统信息散列。这样,“黑客”就无法通过打开他的一个文件来找出“受害者”的系统哈希。
,我知道没有什么是100%安全的。我把它作为对每一个与安全问题有关的问题的第一次评论。但是,对于实现这样的功能,您有什么建议呢?
发布于 2011-06-03 21:39:50
我认为您的问题是:如何验证给定计算机的文件来源,即使该计算机被破坏了?
让我们看一下大致的大纲。
创建应用程序的
中打开一个文件
现在请回答以下问题:
我们所反对的是什么样的妥协?
面对彻底的妥协,没有解决办法。在一个完全的妥协中,对手可以修改任何应用程序或操作系统功能。
那么,我们可以针对哪些妥协呢?
一定有一些我们还可以信赖的功能。攻击者可能会危害您的应用程序,在这种情况下,您的应用程序所做的任何检查都是不可信任的。攻击者可能会危及操作系统。这是从操作系统妥协到应用程序妥协的一小步。因此,让我们假设攻击者没有破坏操作系统或应用程序。让我们假设攻击者能够修改系统上的任何文件,但包含可执行文件的文件和包含基本操作系统组件的文件除外。
我们如何鉴定原产地?
散列值(如SHA1和MD5 )用于验证完整性。文件上的哈希值只能告诉您,自创建哈希以来,该文件是否未经修改。它不能告诉你文件是从哪里来的。数字签名提供了对原产地的检查。数字签名告诉您,签名的数据起源于对用于签名邮件的密钥拥有控制权的人。
现在,如果要验证计算机上的文件是否来自该计算机,那么每台计算机都必须有一个不同的密钥来签名数字消息。
如果您在一台计算机上只有一份应用程序的副本,这是没有问题的。但是,当您有多个密钥时,您需要考虑密钥的生成和分发。密钥的生成和分配是一个非常困难的问题。数字签名需要一个公共私钥对。私钥必须受到保护,并且必须对每台计算机都是唯一的。在此之前,我们假定攻击者无法修改您的应用程序,但我认为,假定攻击者可以读取您的可执行文件是公平的。这个假设使您的可执行文件成为存储私钥的糟糕地方。你可以加密你的密钥,但你需要另一个密钥来解密你的密钥。这里有几个可能的答案:
signatures.
只有当操作系统提供这些功能时,才能使用操作系统。这里的一个基本问题是,您如何知道每台计算机都有唯一的密钥?
网络服务器非常类似于操作系统,但您可以为服务器提供比个人计算机更大的保护。如果有足够的保护,您可以假设会检测到妥协,在这种情况下,它将停止签名和验证服务。它还为您提供了唯一密钥的保证,因为服务器将为应用程序的每个实例生成一个新的唯一密钥。
我想我们都很熟悉记忆密码和引脚的问题。这里的一个小变体是,您可以使用更短或更简单的密码来加密更大、更复杂的密钥。较短/更简单的密码的缺点是更容易强行解密较长/复杂的密钥。
https://stackoverflow.com/questions/6083984
复制相似问题