Android应用程序以安全的方式从服务器检索数据

Pet*_*nas 10 java android inputstream bufferedreader

显然我不是android或java专家.我想在Android应用中做的是从服务器加载数据.我已经开始使用这部分并附上了源代码.但我想以一种安全的方式做到这一点.作为第一步,而不是http://thisismyurl.com/a.php?action=get我想用这样的用户名/密码http://username:password@thisismyurl.com/a.php?action=get来做:我怎么做?我应该只将用户名和密码部分添加到网址吗?

让我说我已经完成了这将不会有任何用处,因为有人可以打开apk并反编译源代码并获取网址和用户名/密码.那么有一种真正安全的方式吗?

我希望我能在这里得到理解.

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();

    }   

}
Run Code Online (Sandbox Code Playgroud)

nKn*_*nKn 7

首先,您应首先考虑您想要实现的目标以及之后如何以及之后的决定.

首先,您必须明确恶意用户尝试破解您的应用程序,如果您的应用程序存储财务,个人或其他类型的敏感数据,持久性将以指数方式增加.

话虽如此,还有一些注意事项:

  • 在代码中硬编码密钥是个主意.如果你这样做,那么破解者破解你使用过的密钥只是时间问题.

  • URL中的硬编码密钥甚至更糟糕.请记住,您的网址会在到达终点(您的服务器)之前经过很多地方,同时,任何有权查看该流量的人都会看到您的凭据,即使您未加密地发送这些凭据也是如此.

  • 根据您将如何生成密钥,我建议使用对称或非对称加密:

    • 如果您计划为所有客户端存储唯一的密码(顺便说一句,这也是一个坏主意,因为如果恶意用户破坏您的密钥,他们可能拥有您客户的所有信息),您可以使用对称加密方法像AES一样.您只需加密消息,通过HTTP POST(例如)发送消息并在另一侧解密.很简单的概念.

    • 如果您计划为每个客户生成一个密钥,那么您有一个额外的障碍,您需要让服务器知道您生成的密钥,或者您的客户知道哪个密钥为客户生成了(取决于您如何面对它).在这种情况下,您可以使用下一个点方法(这基本上是我将从所有这些中推荐的方法).

  • 您可以简单地使用不对称加密方法.这意味着服务器生成一对密钥,一个是公钥,一个是私钥.用户(客户端)将使用公共加密消息并将其发送到服务器.您可能想知道:我如何保护我的消息,以便除了我的服务器之外没有人可以解密它们?这是私钥加入的地方,如果你有私钥,你可以解密消息.这就是为什么你不想与任何人分享它(这就是它的名字来源).这样,您的客户可以随时拥有您的公钥而不需要任何混淆,然后您使用它来加密某些文本并发送它.服务器将使用其私钥解密消息并相应地处理它.

最后一种方法的优点是:

  • 您不必担心如何使密钥安全地到达另一方,因为它将被加密并且服务器只能解密.

  • 您无需为每个客户生成密钥.

  • 如果你选择一个好的非对称算法,比如SSL/TLS,你不需要担心它的破解(或者至少,不如你选择其他方法那么多).

  • 更换旧密钥对就像生成一对新密钥一样简单,替换旧的私钥并使客户端拥有新的公钥.

您可能想看看这些链接:

  1. 公钥加密

  2. 对称密钥算法

  3. 高级加密标准(AES)

  4. 传输层安全性