草庐IT

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

coder 2023-11-21 原文

显然我不是 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 - Android 应用程序以安全的方式从服务器检索数据的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  4. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  7. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  8. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  9. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  10. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

随机推荐