我有一个 HelloWorld 程序,由我签名并从我的公司网站分发。但有人从我的网站下载了它,将其包装到 SuperDuperHelloWorld 程序中,还在安装程序中添加了一些恶意软件。如果我的程序不是直接从我的网站下载的,我不希望它正确安装。有没有办法设置这样的限制? - 也许并非总是如此,但在一定比例的情况下,比如 95%。
答案1
我很久以来一直在想同样的问题,但我无法对此进行更详细的阐述,因为我不具备所需的全部知识,但是这只是一个想法:
- 生成随机密钥对。生成哈希二进制文件的当前版本。将它们存储在本地数据库中。
- 捆绑包一民众密钥与下载一起,例如通过电子邮件发送给客户端。
- 客户打开应用程序后,系统会显示一个验证窗口。验证过程要求民众密钥并生成哈希二进制。
- 客户端发送民众密钥和二进制文件的哈希发送到你的服务器,然后你检查秘密钥匙和哈希数据库中的二进制版本。
- 响应使用以下方式加密:民众通过密钥秘密算法,因此任何潜在的诈骗者都无法拦截连接并让您的应用认为它已得到正确验证。
- 您可以存储民众密钥和加密响应秘密文件,这样你就不必重复验证每次处理。您只需使用秘密算法和民众知道它是否已经得到正确验证的关键。
这种方法的缺点:
- 客户端必须至少有一次互联网连接。
- 客户端的程序无法已验证两次(例如在不同的计算机上),即使它是一个合法的客户端。
- 虽然文件和响应的存储是加密的,但这并不能阻止任何攻击者知道它的位置并捆绑验证对与任何被盗二进制文件来绕过你的安全性。
- 如果二进制文件相对较大,则二进制文件的散列过程可能需要一段时间。
这不会阻止任何骗子下载你的应用并重新发布,但至少他们无法向malware
其中注入任何内容,因为哈希-检查……他们会吗?事实上他们可以;如果诈骗者设法修改你的二进制文件并添加适当的指令以绕过验证过程的安全性,则验证过程可能会被破解。就像……
改变这一点
if (validate(response) == true) {
/* The app is validated */
}
为了这:
if (!validate(response) == true || true) {
/*
* The app would be validated no matter
* if it was properly validated or not
*/
}
因此,你最后的办法就是让验证过程的指令足够模糊,不容易被猜到和修改,并且希望你的骗子不够智能,无法找到并修改它们。