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

显然我没有 androidjava专家.我在 Android应用程序中要做的是从服务器加载数据.我已经在这个部分工作了,并附上了源代码.但我想以一种安全的方式来做到这一点.作为第一步,而不是http://thisismyurl.com/a.PHP?action=get我想用这样的用户名/密码:http:// username:password@thisismyurl.com/a.PHP? action = get我该怎么做?我应该将用户名和密码部分添加到url吗?

让我说我已经完成了这不会有任何用处,因为有人可以打开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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...