让我说我已经完成了这不会有任何用处,因为有人可以打开apk并反编译源代码,并获取url和用户名/密码.那么有一种真正安全的方式呢?
我希望我在这里得到理解.
String url = "http://thisismyurl.com/a.PHP?action=get"; String result = Web.executeWeb(url); public class Web { public static String executeWeb(final String url) { final StringBuilder sb = new StringBuilder(); Thread thread = new Thread(new Runnable() { public void run() { try { InputStream is = (InputStream) new URL(url).getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String result,line = reader.readLine(); result = line; while((line=reader.readLine())!=null){ result+=line; } sb.append(result); //System.out.println(result); //Log.i("My Response :: ",result); } catch (Exception e) { // TODO: handle exception } } }); thread.start(); try { thread.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sb.toString(); } }
解决方法
首先,您必须明确,恶意用户将尝试破解您的应用程序,如果您的应用程序存储财务,个人或其他类型的敏感数据,持久性将以指数增长.
话虽如此,有几点考虑:
>将密码转换成代码是一个坏主意.如果你这样做,那么破解者就可以解释你使用了什么关键时间.
> URL中的硬编码密钥甚至更糟糕.请记住,您的URL将在到达终点(您的服务器)之前穿过很多地方,同时任何访问权限的用户都可以看到您的凭据,甚至在没有加密的情况下也不会发送密码.
>根据你如何生成密钥,我建议使用对称或非对称加密:
>如果您打算为所有客户端存储唯一的密码(顺便提一下,也是一个坏主意,因为如果恶意用户打破了密钥,那么他们可能拥有所有客户的信息),您可以使用对称加密方法如AES.您只需加密您的邮件,通过HTTP POST发送(例如)并在另一方解密.很简单的概念
>如果您计划为每个客户端生成一个密钥,那么您将有其他障碍,您需要使您的服务器知道您生成的密钥,或您的客户端知道为客户端生成了哪个密钥(依赖于您的身份面对它).在这种情况下,您可以使用下一个积分方法(基本上是所有这些方法之一).
>你可以简单地使用一个不对称的加密方法.这意味着服务器生成一对密钥,一个公钥和一个私钥.用户(客户端)将使公众对消息进行加密并将其发送到服务器.你可能会想:如何保护我的邮件,所以没有人可以解密他们,但我的服务器?这就是私钥加入的地方,如果你有私钥,你可以解密消息.这就是为什么你不想与任何人分享(这就是它的名字来自).这样,您的客户可能随时都可以使用您的公用密钥,无需任何混淆需求,因此您可以使用它来加密一些文本并发送.服务器将使用其私钥对消息进行解密,并相应处理.
最后一种方法的优点是:
>您不必担心如何使密钥安全地到达对方,因为它将被加密,只是服务器能够解密.
>您不需要为每个客户端生成一个密钥.
>如果你选择一个很好的非对称算法,如SSL / TLS,你不需要担心它的破裂(或至少,不如你选择了其他方法).
>更换一对旧钥匙就像生成一对钥匙一样容易,替换旧的私钥,使您的客户端拥有新的公钥.
你可能想看看这些链接:
> Public-key cryptography
> Symmetric-key algorithm
> Advanced Encryption Standard (AES)
> Transport Layer Security