我已经阅读了10多个类似的问题,我仍然对如何正确保护我的JavaFX软件免受逆向工程感到困惑。据我所知,防止攻击是绝对不可能的,特别是在Java中,并且ProGuard或类似程序可以在某种程度上进行混淆,但是专门的人可能会逆转它。我也明白,我应该尽量减少烦人的合法客户 - 同时保持足够的安全性,以阻止这些边缘案件购买。
我已阅读here和here我应该使用服务器执行所有敏感,有价值的功能和数据操作,例如许可证验证。我构建了一个PHP login系统,并使用PostgreSQL将其集成到我的代码中。我正在将所有重要代码迁移到服务器并使用REST从服务器返回响应。客户端代码最终将是一个骨架,连接所有多汁的服务器调用。
现在,当用户启动我的应用程序时,它会检查其系统上的许可证文件,如果存在,则散列内容并将它们与我的数据库进行比较。如果没有许可证文件,则会提示他们输入经过哈希处理并与我的数据库进行比较的用户名/密码。这很好用,除了我觉得它没有意义。
上面的第一个链接说服务器不应该返回一个简单的布尔值,因为
如果[服务器]只返回一个布尔值,那么它将非常容易 人们只需编辑他们的主机文件(至少在Windows上)并拥有 小型服务器运行始终返回true。 让它返回一些 从您发送的随机密钥生成的特定密码。 即在您发送的数据中,包含一个随机字符串,然后对其进行哈希处理 发回哈希值。然后检查哈希匹配。
如果我的代码返回一个简单的布尔值或使用随机字符串,那么它会有什么不同 - 如果攻击者可以简单地去混淆和删除验证条件,甚至可以检查服务器。例如,如果我的源代码包含:
if(validateUsingServer(String license_details){
// grant access
}
然后有人可以去混淆并用
替换它if(1==1){
// grant access
}
方法validateUsingServer
可以执行各种散列技巧,但如果攻击者可以完全从源代码中删除这些条件,那么服务器提供了哪些好处?
我已经在我的代码中实现了jBCrypt,其中包括(i)许可文件内容或(ii)输入的用户名/密码,并为其添加随机字符串,该字符串使用以下内容生成:
... {
String random_String = org.apache.commons.codec.binary.Base64.encodeBase64String(getNextSalt());
} ...
然后,服务器提取此随机字符串,对其进行哈希处理,并仅在验证信息正确时返回哈希值。同时客户端也会对其进行哈希处理并将其与服务器的响应进行比较。这似乎并不比布尔值强,因为两者都可以在源代码中替换并重新编译。
我错过了什么吗?也许这是Java可以做的保护程度,如果攻击者实际上 用true
替换所有我的验证条件,那么它们实际上只是绕过了对骨架架构的访问,在合法的服务器访问上执行任何实质性的操作。
如果您要声明这是重复的,请具体参考能够解决我的困惑的句子。谢谢你。