【问题标题】:Secure Android POST Data to Web Server API from Packet Capture APP从 Packet Capture APP 保护 Android POST 数据到 Web 服务器 API
【发布时间】:2016-01-30 16:24:47
【问题描述】:

首先我很抱歉我的英语不好。 我目前正在开发 android 应用程序,该应用程序需要用户从 Web 服务器上的现有数据库登录,并且该应用程序运行顺利,但是当我尝试使用 Google Play 的数据包捕获应用程序跟踪通过我的应用程序发送的数据包时,密码数据我的应用程序发送的是纯文本(未加密)。我尝试使用 base64 编码来加密密码,但 base64 非常常见且易于解码,我的问题是:
1. 是否有另一种方法来保护(加密)从 android 应用程序发送到 Web 服务器上的 PHP 的数据(用户名、密码等)?
2.在使用抓包应用时,看到另外一个知名应用如Facebook、BBM等在抓包应用上显示“No Data”,怎么办?

注意: 数据包捕获链接在这里: play.google.com/store/apps/details?id=app.greyshirts.sslcapture

这是我在登录类中的 doInBackground :

    @Override
    protected String doInBackground(String... arg0) {
    String url = "http://mydomainhost.com/login.php?" +
                 "username="+ username.getText().toString() +
                 "&password="+ password.getText().toString() + "&imei=" + imei;
        JSONParser jParser = new JSONParser();

        JSONObject json = jParser.getJSONFromUrl(url);
        try {
            success = json.getString("sukses");
            pesan = json.getString("pesan");

            Log.e("error", "nilai sukses=" + success);

            JSONArray hasil = json.getJSONArray("login");

            if (success.equals("1")) {

                for (int i = 0; i < hasil.length(); i++) {

                    JSONObject c = hasil.getJSONObject(i);

                    String id = c.getString("id").trim();
                    String username = c.getString("username").trim();
                    String nama = c.getString("nama").trim();
                    String email = c.getString("email").trim();
                    String som_id = c.getString("som_id").trim();
                    gcm_regid = c.getString("gcm_regid").trim();
                    session.createLoginSession(id, username, nama, email, imei, som_id, gcm_regid);
                    Log.e("ok", " ambil data");

                }
            } else {
                Log.e("erro", "tidak bisa ambil data 0");
            }

        } catch (Exception e) {
            Log.e("error", "tidak bisa ambil data 1");
        }
        return null;

    }

这里是PHP接收登录类:

$pass_acak = generateHash($password,'yr');
$username   = strtolower($username);
$sql_cek = "SELECT * FROM user WHERE username='$username' AND password='$pass_acak' LIMIT 1";
$qry_cek = mysql_query($sql_cek);
$dt=mysql_fetch_array($qry_cek);
$ada_cek = mysql_num_rows($qry_cek);
if ($ada_cek >=1) {
    if($dt['status']==0){
        $respon['sukses']=0;
        $respon['pesan']="Username ".$username." Tidak Aktif!";
    } else {
        if($imei==$dt['imei']){
            $respon['sukses']=1;
            $respon['pesan']="Login Berhasil";
            $h['id']=$dt['id'];
            $h['username']=$username;
            $h['email']=$dt['email'];
            $h['nama']=$dt['nama'];
            $h['som_id']=$dt['som_id'];
            $h['imei']=$dt['imei'];
            $h['gcm_regid']=$dt['gcm_regid'];
            $respon['login'][]=$h;
        } else {
            $respon['sukses']=0;
            $respon['pesan']="IMEI tidak cocok!";
        }
    }
} else {
    $respon['sukses']=0;
    $respon['pesan']="Username / Password Salah!";
}

注意:generateHash 是我自己生成加密密码的函数

这是我的应用程序的数据包捕获结果:

POST /login.php?username=anggazan&
password=mypassword&imei=01234567890123456 HTTP/1.1
Content-Length: 0
Host: mydomainhost.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)

HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.29
Content-Type: text/html
Content-Length: 336
Date: Sat, 30 Jan 2016 15:48:02 GMT
Accept-Ranges: bytes
Server: LiteSpeed
Connection: close

{"sukses":1,"pesan":"Login Sukses"}

注意:对不起,我将我的真实密码更改为“mypassword”,将我的真实 imei 更改为“01234567890123456”以保护隐私。

Here is Packet Capture look like,我的应用程序名称是 TSMobile Semarang,这表明我的应用程序发送了 778B 数据,但其他应用程序(如 facebook、小米和任何 google 应用程序)显示“无数据”。

This 是我在 Packet Capture APP 中单击带有“No Data”和 SSL 符号的 Facebook 应用程序时的样子。看起来facebook加密了他们的数据,怎么做?

【问题讨论】:

    标签: android post encryption


    【解决方案1】:

    只要您使用 HTTPS 而不是纯 HTTP,您的数据就已经加密。

    您提到的应用程序执行中间人攻击,如果您安装此应用程序,您是故意说它应该解密您的数据。如果您的 TLS 客户端以接受连接的方式进行配置,那么您几乎无能为力。

    我也怀疑 facebook 是否使用了额外的加密,我猜它只是 gzip 压缩或其他编码的内容。

    当然,您可以对所有内容进行端到端加密,但是您必须向我们展示您已经尝试过的内容,向我们展示代码。

    【讨论】:

    • 嗨...谢谢您的回答...https 不能解决问题...我有其他使用 https 连接的应用程序,但数据包捕获应用程序可以读取纯文本数据但加密密码,我会尽快用 https 更新捕获的数据...
    • 嗨...我已经添加了我的代码...当我在我的应用程序上发送我的 POST 数据时如何使用 gzip 或编码?
    • 是的,我使用 HTTP 因为我使用不支持 HTTPS 的共享主机...如果我只想保护从我的应用程序发送到 Web 服务器上的 PHP 的密码,最好的解决方案是什么?我的想法是我在我的应用程序上对密码进行编码并在我的 PHP 上对其进行解码,但我不知道该怎么做......如果我问了很多问题,我很抱歉,因为我是 java 的初学者......跨度>
    • 好吧,我已经把它放在我的答案中了,你可以自己加密它。 (注意:最好使用术语加密,而不是编码)。但是你必须自己开始寻找解决方案,如果你遇到问题,你可以在这里问。不懂Java也没关系,你懂哪些语言?架构是一样的,你只需要找到相应的语言结构和库。但是您的问题的答案保持不变:使用 HTTPS!那不会改变的。如果很重要,请使用 HTTPS!没有任何借口。
    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 2019-12-14
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多