Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果可以更改客户端条件,那么服务器验证的意义是什么?_Java_Rest_Hash_Server_Reverse Engineering - Fatal编程技术网

Java 如果可以更改客户端条件,那么服务器验证的意义是什么?

Java 如果可以更改客户端条件,那么服务器验证的意义是什么?,java,rest,hash,server,reverse-engineering,Java,Rest,Hash,Server,Reverse Engineering,我已经阅读了10多个类似的问题,但仍然不知道如何正确地保护我的JavaFX软件免受逆向工程的影响。我知道,要防止攻击永远不可能百分之百地发生,特别是在Java中,ProGuard或类似的软件可能会在一定程度上造成混淆,但一个专门的人可以扭转这种局面。我也明白,我应该尽量减少恼人的合法客户,同时保持足够的安全性,以阻止这些边缘案例购买 我已经读到,我应该使用服务器来执行所有敏感、有价值的功能和数据操作,例如许可证验证。我已经构建了一个系统,并使用PostgreSQL将其集成到我的代码中。我正在将所

我已经阅读了10多个类似的问题,但仍然不知道如何正确地保护我的JavaFX软件免受逆向工程的影响。我知道,要防止攻击永远不可能百分之百地发生,特别是在Java中,ProGuard或类似的软件可能会在一定程度上造成混淆,但一个专门的人可以扭转这种局面。我也明白,我应该尽量减少恼人的合法客户,同时保持足够的安全性,以阻止这些边缘案例购买

我已经读到,我应该使用服务器来执行所有敏感、有价值的功能和数据操作,例如许可证验证。我已经构建了一个系统,并使用PostgreSQL将其集成到我的代码中。我正在将所有重要的代码迁移到服务器,并使用REST从服务器返回响应。客户端代码最终将成为一个框架,连接所有有趣的服务器调用

现在,当用户启动我的应用程序时,它会检查他们系统上的许可证文件,如果存在许可证文件,则会对内容进行散列,并将其与我的数据库进行比较。如果没有许可证文件,则会提示他们输入用户名/密码,该用户名/密码经过哈希处理并与我的数据库进行比较。这很好,只是我觉得它毫无意义

上面的第一个链接说服务器不应该返回简单的布尔值,因为

如果您让[服务器]只返回一个布尔值,这将非常容易 人们只需编辑他们的主机文件(至少在windows上),就可以 运行的小型服务器总是返回true让它返回一些 从您发送的随机密钥生成的特定密码类型。 也就是说,在您发送的数据中,包含一个随机字符串,然后对其进行散列并 发回散列。然后检查哈希匹配

问题: 如果我的代码返回一个简单的布尔值或使用一个随机字符串,或者甚至与服务器进行检查,如果攻击者可以简单地消除混淆并删除验证条件,这会有什么区别。例如,如果我的源代码包含:

if(validateUsingServer(String license_details){
 // grant access
}
然后有人可以消除混淆并用

if(1==1){ 
// grant access
}
方法
validateUsingServer
可以使用各种散列技巧,但是如果攻击者可以完全从源代码中删除这些条件,那么服务器有什么好处呢

我已经在我的代码中实现了,它散列(I)许可证文件内容或(ii)输入的用户名/密码,并向其中添加一个随机字符串,该字符串是使用以下方法生成的:

... {
String random_String = org.apache.commons.codec.binary.Base64.encodeBase64String(getNextSalt());  
} ...
然后,服务器提取这个随机字符串,对其进行散列,并仅在验证信息正确时返回散列。同时,客户端还对其进行散列,并将其与服务器的响应进行比较。这似乎并不比布尔值强,因为两者都可以在源代码中替换并重新编译

我错过什么了吗?也许这就是Java所能提供的保护范围,如果攻击者真的用
true
替换了我的所有验证条件,那么他们实际上只是绕过了对骨架体系结构的访问,而骨架体系结构依赖于合法的服务器访问来执行任何实质性的操作


如果你要说这是重复的,请特别参考回答我困惑的句子。非常感谢。

基本上没有办法“完全”保护不向服务器发送令牌/等的应用程序。(即使这是可以破解的,但不是微不足道的。)它总是归结为ROI权衡。没有任何代码是不能被破解的——最终。但攻击者也有一个投资回报率,这就是我所想的。我正在调查代币,戴夫,谢谢你。如果你对一个象征性的新手有什么特别的建议,那我洗耳恭听。我马上想到的是->你在客户端的什么地方存储代币?在静态字段中,以便令牌可以从各种类别访问并发送到服务器?此外,令牌系统如何可黑客攻击,因为攻击者无法通过在HTTP报头中使用伪造的服务器端虚拟令牌,如果令牌与数据库中的令牌不匹配,则返回404?也许你的意思是黑客可以攻击实际数据库?如果你知道令牌是如何生成的,或者使用其他人的令牌,或者。。。所有这些问题都在别处得到了了解和讨论。正如我所说的,这不是一个简单的黑客攻击。基本上没有办法“完全”保护一个不在每次请求时向服务器发送令牌/等的应用程序。(即使这是可以破解的,但不是微不足道的。)它总是归结为ROI权衡。没有任何代码是不能被破解的——最终。但攻击者也有一个投资回报率,这就是我所想的。我正在调查代币,戴夫,谢谢你。如果你对一个象征性的新手有什么特别的建议,那我洗耳恭听。我马上想到的是->你在客户端的什么地方存储代币?在静态字段中,以便令牌可以从各种类别访问并发送到服务器?此外,令牌系统如何可黑客攻击,因为攻击者无法通过在HTTP报头中使用伪造的服务器端虚拟令牌,如果令牌与数据库中的令牌不匹配,则返回404?也许你的意思是黑客可以攻击实际数据库?如果你知道令牌是如何生成的,或者使用其他人的令牌,或者。。。所有这些问题都在别处得到了了解和讨论。正如我所说,这不是一个微不足道的黑客行为。