HTTPS-Web请求和响应是否已加密?

时间:2019-07-19 17:13:03

标签: java android http https ssl-certificate

Am从android应用程序向HTTPS服务器发出网络服务调用。下面是代码片段,通过它们可以成功进行Web服务调用并获得响应。

我的问题是,在调用HTTPS服务器之前,我们是否需要执行任何其他步骤来加密数据? 因为,从android profiler能够看到我所有的纯文本格式的Web请求。我的理解是,在进行HTTPS调用之前,请求将被加密。

enter image description here

     public static WebServiceResp makeWebServiceCall(String XML, String urlPath) throws IOException{
    //Code to make a web service HTTP request
    String responseString = "";
    String outputString = "";
    String wsURL = urlPath;
    URL url = new URL(wsURL);
    URLConnection connection = url.openConnection();
    HttpsURLConnection httpConn = (HttpsURLConnection)connection;
    ByteArrayOutputStream bout = new ByteArrayOutputStream();


    //System.out.println(XML);

    byte[] buffer = new byte[XML.length()];
    buffer = XML.getBytes();
    bout.write(buffer);
    byte[] b = bout.toByteArray();
    // Set the appropriate HTTP parameters.
    httpConn.setRequestProperty("Content-Length",
                                String.valueOf(b.length));
    httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
    httpConn.setRequestMethod("POST");
    httpConn.setRequestProperty("Cache-Control", "no-cache");

    httpConn.setDoOutput(true);
    httpConn.setDoInput(true);


    OutputStream out = httpConn.getOutputStream();
    //Write the content of the request to the outputstream of the HTTP Connection.
    out.write(b);
    out.close();
    //Ready with sending the request.

    //Check the status
    int status = httpConn.getResponseCode();
    Log.d(TAG, "makeWebServiceCall: "+"Processing Status: "+status);


    BufferedReader in;
    if (status <= 200) {
        //Read the response.
        Log.d(TAG, "makeWebServiceCall: Getting Input Stream");
        InputStreamReader isr =
                new InputStreamReader(httpConn.getInputStream());
        in = new BufferedReader(isr);
    }else{
        //Read the response.
        Log.d(TAG, "makeWebServiceCall: Getting Error Stream");
        InputStreamReader isr =
                new InputStreamReader(httpConn.getErrorStream());
        in = new BufferedReader(isr);
    }

    //Write the SOAP message response to a String.
    while ((responseString = in.readLine()) != null) {
        outputString = outputString + responseString;
    }
        Log.d(TAG, "makeWebServiceCall: WebServiceResponse " + outputString);
        //Parse the String output to a org.w3c.dom.Document and be able to reach every node with the org.w3c.dom API.
        Document document = Utils.parseXmlFile(outputString);
        //NodeList nodeLst = document.getElementsByTagName("GetWeatherResult");
        // String weatherResult = nodeLst.item(0).getTextContent();
        //System.out.println("Weather: " + weatherResult);

        //Write the SOAP message formatted to the console.

    WebServiceResp webServiceResp = new WebServiceResp();
    webServiceResp.setDocument(document);
    webServiceResp.setStatus(status);
    return webServiceResp;

}

5 个答案:

答案 0 :(得分:3)

不。如果您将其发送到https网站,则加密将作为协议的一部分进行。您无需执行任何其他工作。

答案 1 :(得分:1)

不。您看到的加密在网络层上。发起https调用的客户端查看发送了什么和接收了什么。这就是https的工作方式。

当您查看chrome浏览器的“网络”标签时,会看到发送的内容和接收的内容。现在,这不是安全问题,https的使用更多地是关于您的工作,这使得网络之间的任何人都难以窃听您的数据。

现在,如果您仍然需要更高级别的安全性,则可以使用证书固定

https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning

https://medium.com/@appmattus/android-security-ssl-pinning-1db8acb6621e

How can you add to network_security_config from MainActivity

因此,在这种技术中,您基本上说的是,您期望的证书哈希是具有此内容的。然后,如果有人在系统上使用带有受信任CA的受信任代理,即使在为给定域生成有效证书之后,也不会建立连接。

答案 2 :(得分:1)

加密/解密由OS提供的内置网络客户端模块完成。因此,您不必担心。

您可以使用某些客户端工具查看纯文本,因为它们确切知道它们要发送/接收的内容。例如。 chrome开发人员工具。 (实际上,他们也不在乎加密/解密。)

答案 3 :(得分:0)

HTTPS对您的应用程序是透明的,所有的魔术都发生在传输层之间(因此称为“传输层安全性”),您可能会想像过去的加密电报,将军们以纯文本的形式告诉电报员消息,而电报员发送他们以加密形式(可能使用某种密码本),没有同一密码本的任何人都不能轻易解密消息,而使用电报的任何人都不在乎密码本(甚至不知道密码本,除了“传输层”两侧的那些电报员。

答案 4 :(得分:0)

是否有任何STEP STEP教程来实施HTTPS POST。要求您分享链接。 谢谢