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

标签 java android inputstream bufferedreader

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

假设我已经完成了这没有任何用处,因为有人可以打开 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();

    }   

}

最佳答案

首先,您应该首先考虑您想要实现什么以及如何,然后再决定您需要什么。

首先,您必须清楚恶意用户尝试破解您的应用,如果您的应用存储财务、个人或其他类型的敏感数据,持久性将呈指数级增长。

话虽这么说,但有几点需要考虑:

  • 将键硬编码到您的代码中是一个的想法。如果您这样做,黑客破解您使用的 key 只是时间问题。

  • 在 URL 中硬编码键是一个更糟糕的主意。请记住,您的 URL 在到达终点(您的服务器)之前会经过很多地方,同时任何有权查看该流量的人都会看到您的凭据,甚至在您不费力的情况下以未加密的方式发送它们。

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

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

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

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

最后一种方法的优点是:

  • 您不必担心如何让您的 key 安全地到达对方,因为它会被加密,只有服务器能够解密。

  • 您不需要为每个客户端生成 key 。

  • 如果您选择了一个很好的非对称算法,例如 SSL/TLS,您就不必担心它会被破解(或者至少,不会像您选择了一些其他方法)。

  • 替换旧 key 对非常简单,只需生成一对新 key 、替换旧私钥并让您的客户拥有新公钥即可。

您可能想看看这些链接:

  1. Public-key cryptography

  2. Symmetric-key algorithm

  3. Advanced Encryption Standard (AES)

  4. Transport Layer Security

关于java - Android 应用程序以安全的方式从服务器检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22596895/

相关文章:

java - Java 中的链接输入流

java - 我们可以在 Java 中将字节数组转换为 InputStream 吗?

java - 当 SAME 方法在 Java 中不返回值时,Lambda 会返回一个值

Android Studio - Logcat 不会将我带到发生异常的代码行

java - Android:将编辑文本字段链接到按钮

android - 从android中的 Intent 选择器选择选项(相机或图库)后请求权限

java - 从本地机器到tomcat部署的webapp的InputStream

java - Spring MVC - 将调度程序 url 模式设置为 "/"会导致 Controller 无法工作并出现 404 错误

java - Selenium Webdriver (Java) 与 Firefox 扩展/插件连接/互操作

java - Feign抛出错误而不是返回ResponseEntity,如何回到调用者方法