c# - 无需互联网查询即可确保付费应用程序安全的最佳方式

标签 c# .net security

我有一个正在销售的应用程序,我想对其进行扩展。

然而,我不希望人们只能复制 EXE 文件并将其提供给他们的 friend 等。我知道这几乎是不可能完成的任务,但我想让非技术人员尽可能难以完成。

显然,每次他们启动应用程序时,我都可以通过互联网对数据库进行 key 查找,但这意味着:

  1. 我的服务器有大量互联网流量,我愿意为此付费。
  2. 如果无法验证 key ,无法访问互联网的人(或我的服务器出现故障/或某个地方的路由器)可能会阻止该应用程序运行。
  3. 使用 Wireshark/流量嗅探器的聪明人可以解码我发回的任何 key 以激活应用程序,然后编写一些东西来绕过它。

因此我在考虑一些简单的东西,例如与计算机名称/MAC 地址/IP(购买时)相关的校验和,然后将其存储在计算机注册表中(1 个许可证 = 1 个 key )。

然后,当应用程序打开时,它会检查正确的注册表项,并将其与应用程序内的设置变量进行比较,以确保它在应用程序启动之前匹配。

如果有人将该应用程序提供给另一台计算机,则该 key 将不存在(如果他们购买了它,我可以给他们一个特殊的一次性 key ,该 key 将在注册表中重新设置他们的 key 等)。没有原始付款详细信息的人无法获得此信息。

有没有人有任何不围绕互联网查询等的更好的想法,或者看到我提出的想法有任何问题?

该应用程序是用 C# 编写的,作为 .NET 4.5 中的 Windows 窗体应用程序

如有任何帮助,我们将不胜感激。

最佳答案

好的,在这种情况下,我会建议对产品 ID 做一些事情 - 这样可以在程序启动时检查 ID。但是,请记住,必须将“允许的 key ”在线或在应用程序本身后面输入到某个数据库中。

然后,当程序启动时,它会检查用户的产品 ID,并将其与已放在“允许列表”中的 ID 进行检查。

这取决于“允许的 ID”的存储方式。如果您只是在代码中存储用户的单一 ID 然后对其进行编译 - 不。如果您在与应用程序分开的某种数据库中有大量允许的 ID 列表 - 是的。这取决于黑客的技能水平,大多数优秀的黑客将能够完成他们设定的目标 - 无论他们如何去做 - 甚至达到破解核心代码开发系统的地步.

如果您不考虑后者,您可以简单地将允许的 ID 存储在一个变量中:

string AllowedID = "1234-ABCD-5678-EFGH";

然后,要根据用户的 Windows 操作系统产品 ID 检查它,您可能需要查询注册表(当我说产品 ID 时,我不是指用于安装操作系统的序列号,因为存储它可能有一些道德问题影响)。

您可以这样做来检索产品 ID(在 Win7 Ultimate x64 上测试):

private void Form1_Load(object sender, EventArgs e)
{
string value64=null;
RegistryKey localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
localKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
if (localKey != null)
{
value64 = localKey.GetValue("ProductID").ToString();
}
if (value64 == AllowedID)
{
MessageBox.Show("Successfully Authenticated");
//run the application functions etc
}
else
{
MessageBox.Show("Error Authenticting");
}
}

希望对你有帮助

关于c# - 无需互联网查询即可确保付费应用程序安全的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16795521/

相关文章:

c# - .net lambda 表达式和输出参数

c# - 是否可以从 .NET API 从 AWS IAM 用户获取规范用户 ID?

c# - If/Else语句, "DoNothing"或 "Continue"怎么说

security - 盐是否需要随机才能保护密码哈希?

c# - 从字符串转换为唯一标识符时转换失败

c# - CLR 正在优化我的 forloop 变量

c# - 使用 C#,如何检测断开的链接或标记?

php - 通过 URL 指定 Controller 类与为每个 Controller 都有一个脚本的优缺点是什么?

objective-c - 这是在 iPhone 上生成随机字符串的好方法吗?

c# - Clarifying Identity Authorization : using Claims as Roles, Roles and Claims or 角色声明