将字符串保存在 java 文件中以供以后运行 jar?试图制作一个字符串来告诉我的 jar 是不是被激活
Posted
技术标签:
【中文标题】将字符串保存在 java 文件中以供以后运行 jar?试图制作一个字符串来告诉我的 jar 是不是被激活【英文标题】:Saving strings in java files for later runtimes of the jar? Trying to make a string which tells my jar if its been activated or not将字符串保存在 java 文件中以供以后运行 jar?试图制作一个字符串来告诉我的 jar 是否被激活 【发布时间】:2015-04-08 12:53:19 【问题描述】:我有一个编译为.jar
的java 程序,它需要启用激活密钥。我希望jar
在第一个runtime
上提示您输入激活密钥,一旦激活,存储一个字符串,稍后runtimes
可以读取该字符串以确定它是否已启用。
有什么建议可以解决这个问题吗?
注意:我希望将字符串秘密存储,以免有人欺骗程序以为它已启用。
更新:我一直在玩首选项 api,如果程序已启用,我正在使用此代码进行存储:
String key = "userKey";
String saveString = "enabled";
Preferences root = Preferences.userRoot();
root.put(key, saveString);
这是在以后的运行时得到的:
String key = "userKey";
String failedtoLoad="Program not enabled";
Preferences root = Preferences.userRoot();
String status=root.get(key, failedToLoad);
每次我运行程序状态最终都是 failedtoLoad 并且找不到 saveString,除非我保存字符串并在同一运行时获取字符串。这是为什么呢?
【问题讨论】:
您希望它有多安全?除非您采取措施对代码进行混淆和/或加密,否则对您的 jar 进行逆向工程仍然是一个可行的选择。 它不必加密或混淆,只要可靠。如果我能弄清楚为什么它不起作用,preferences api 可能正是我所需要的,但是解压 jar 本身并在其中写入一个 .txt 文件仍然在桌面上。 解压你的 jar 并反编译你的类文件,如果你以这种方式继续,可以很容易地删除检查 首选项 API 写入注册表(在 Windows 上)或 .dot 文件。两者都可能失败。在您的示例中,您尝试写入根目录,我不确定这是否可能。尝试在其中添加一个 root.node("com/you/program/settings")。 【参考方案1】:查看 Java 首选项 API (http://docs.oracle.com/javase/8/docs/technotes/guides/preferences/index.html)。它允许在程序执行之间存储首选项和配置数据。
关于保密:正如京东已经提到的,如果你的程序必须能够阅读它,很可能其他人也能阅读它,最终只是你想让他们有多难的问题.最好是有一些字符串,您的程序可以通过算法验证来确定它是否是有效的密钥。在这种情况下,其他人仍然可以搜索已安装的密钥并在其他地方重复使用,但这就像第一个人将密钥传递给其他用户一样。
【讨论】:
我更关心人们共享密钥,而不是对我的算法进行反编译和逆向工程。因此,除了将密钥存储在在线数据库中并在使用后将其删除之外,我还有哪些选择。尽管听起来很奇怪,但我在想,让我的罐子从输入的键中删除所有字母,然后将剩余的双倍除以当月的当前日期,然后除以当前月份。如果结果为整数,则激活机器人,但如果不是整数,则密钥无效。因此,每个键一年中只能工作一天。用户将有 1 天的时间来激活。 对用户不太友好,只有一天。如果用户需要重新安装他/她的计算机怎么办?另外,时区呢?在另一个时区,有效期可能要短得多。我会存储原始密钥并每次重新验证它,而不是只存储一个标志,如果它被验证一次。但这需要不同的密钥格式。【参考方案2】:如果你真的想要安全,你必须在混淆方面比任何潜在的攻击者在逆向工程方面的工作更加努力。如果您想知道如何在代码级别实现安全性,请查看成功的 DRM 的实现。这些通常涉及验证密钥的某些服务器在代码中进行多次非显而易见的检查。
我更喜欢的另一种选择是让用户同意一些限制其使用的法律术语。
【讨论】:
以上是关于将字符串保存在 java 文件中以供以后运行 jar?试图制作一个字符串来告诉我的 jar 是不是被激活的主要内容,如果未能解决你的问题,请参考以下文章