2

我正在开发一个程序,我想与某些人分享,但是如果我对这些人改变主意,我希望能够“撤销”他们对该程序的访问权限。

理想情况下,这将基于每个用户,而不是仅仅阻止程序的所有实例。类似于用户帐户的东西,但目前我真的无法访问可以对这些帐户进行身份验证的服务器,因此可能需要一种更简单的方法。

我是不是太有野心了?

(如果相关,我正在使用 Java。)


对不起,我错过了一些相关的细节:

该应用程序将几乎完全在线使用。我不希望用户群远远超过 100(这是雄心勃勃的),如果有超过 100 个用户,我会在某种身份验证服务器上大放异彩,但是我目前最接近的是我可以在其上存储文件的基本 FTP 服务器。


感谢所有的答案,很遗憾SO只让我选择一个最佳答案。:) 谢谢你们。

4

10 回答 10

3

没有 100% 的保证可以做到这一点。除了硬件解决方案(也可以解决),软件是可操作的。

作为一个非常简单的示例,以一个 Windows 程序(Java 更简单)检查日期以查看它是否可以运行(想想试用件)。即使不设置时钟,您也可以击败它 - 找出它正在执行什么调用来检查日期,然后提供一个备用 DLL,该 DLL 更改该调用以始终返回一个有效的日期。

如果您使用客户端必须连接的服务器,那会更好,因为您可以在服务器端进行所有有效性检查。但是你不能简单地返回一个真/假的东西,因为你可以在网络级别更改东西以将假改变为真。要解决这个问题,您需要使用 SSL 来加密网络流量。

“更好”(在我的脑海中)是让服务器完成程序的工作并让程序显示结果。然后对于没有访问权限的客户端,服务器只是拒绝向他们返回结果。

于 2009-12-15T17:35:52.407 回答
2

如果您的程序依赖于通过网络服务或其他机制对信息进行网络访问,您可以简单地将您希望关闭的用户帐户列入黑名单。

如果它是一个完全离线的应用程序,那么据我所知,你就是 SOL。部署后您对应用程序的唯一控制是通过对您仍然控制的资源的网络请求。

编辑

远非完美无缺,但作为第二个想法,在离线应用程序中,并且仅对于技术不太熟练的用户,您可以尝试通过更新机制控制对应用程序的访问,该更新机制将通过加密的用户名列表等使应用程序无效。尽管这很容易被规避,并且可能会被逆转,因为所有这些信息都存储在客户端机器上。它依赖于它们允许您更新软件。

于 2009-12-15T17:20:21.410 回答
1

由于您无权访问某种独立资源供用户进行身份验证,因此我能想到的唯一答案是“死人开关”,您可以在指定的时间间隔向用户发送许可证文件。应用程序在此时间间隔“过期”,并且必须有一个新文件才能运行。不希望用户使用该软件?不要向他们发送新文件。

这是次优的,原因有很多:

  1. 您的所有用户都必须按时收到此文件,这将导致大量支持工作。
  2. 由于系统完全存在于用户的机器上,规避措施的范围从微不足道到“麻烦”,但总是有可能的。这将随您选择的文件加密和交付算法而异。
  3. 一些非零用户将是“误报”,他们的安装将由于过程中的一些错误而停止工作。
  4. 如果您不在文件中构建用户特定信息,用户将能够相互共享。
于 2009-12-15T17:27:16.903 回答
1

通常的方法是提供允许在一定期限内使用的许可文件。在那段时间之后,用户将不得不请求新的许可证文件。如果您想在不直接连接到服务器的情况下允许使用,这是唯一的方法。但这对各方来说都很烦人——用户被迫请求新的许可证文件,而你被迫创建和分发它们。

可以对服务器进行身份验证,但是,只要您使用的是 java,就不会太安全。即使您混淆了代码,也可以从应用程序中删除身份验证部分或嗅探身份验证流量并构建一个模拟服务器以永久启用该软件。您可以使用加密方法来防止它,但它变得越来越复杂。

保持密切控制的最简单方法是将应用程序的至少一部分作为服务提供——但这当然需要服务器。

于 2009-12-15T17:32:42.120 回答
1

如果没有服务器端组件,您所要求的将是困难且不可靠的。

保证您可以撤销对您的软件的访问的最佳方式是通过基于Internet 的“软件即服务”应用程序。如果您不提供访问权限,他们就没有使用该软件。如果它是基于桌面的应用程序,那么某些关键功能仍然必须位于某处的在线服务器上。

如果用户在其本地计算机上拥有整个应用程序,则可以对其进行逆向工程并以某种方式“破解”。克服这个问题的唯一方法是确保某些功能永远不会出现在他们的机器上。

于 2009-12-15T17:33:04.253 回答
1

根据 CPU 硬件 ID 生成序列号。定期更新您的程序并将某些 CPUS id 的硬代码黑名单列入其中。当然,如果没有收到定期更新,您必须让您的程序过期。

于 2009-12-15T17:33:29.137 回答
1

我猜这是在用户机器上运行的实际应用程序。

我能想到的最简单的方法是使用 Java Web Start,如果你更新它们,它可以确保你的应用程序从 Internet 下载 jars。这包括每个用户的许可证(即 jnlp 文件取决于用户下载它,包括正确的 jar),并且该许可证应该允许用户使用您的应用程序工作数天,即使没有互联网访问,之后新的许可证必须下载(因为该用户的 JNLP 文件已更改)。注意:一定要更改已更改许可证文件的 URL,否则 java 缓存可能已损坏。

许可证文件可以只包含一个查看日期并说真/假以继续的类。它必须适合签名以创建密封罐。

存在更高级的方案,但这将有效,易于维护,并且是允许免费分发和硬核许可方案之间的合理折衷。

于 2009-12-15T19:45:36.327 回答
1

不要打扰。只要您将实际软件分发给客户,总有一种方法可以解决您可以想到的任何方案。最终,它只会让你的软件变得不那么可靠,使用起来更麻烦,从而让潜在客户被吓跑——每个人都输了。

于 2009-12-15T21:21:09.067 回答
0

每个用户都可以有一个唯一的用户名,您可以根据 Web 服务对其进行检查,以查看该特定用户是否仍在宽限列表中。

于 2009-12-15T17:20:46.507 回答
0

每个月都要求用户输入与存储在程序中的相应月份的用户名相匹配的新用户名。如果您想阻止用户使用您的程序,只需停止向他们发送新用户名,他们将在月底后无法使用该程序。

于 2009-12-15T17:50:55.873 回答