Am从android应用程序向HTTPS服务器发出网络服务调用。下面是代码片段,通过它们可以成功进行Web服务调用并获得响应。
我的问题是,在调用HTTPS服务器之前,我们是否需要执行任何其他步骤来加密数据? 因为,从android profiler能够看到我所有的纯文本格式的Web请求。我的理解是,在进行HTTPS调用之前,请求将被加密。
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;
}
答案 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。要求您分享链接。 谢谢