【发布时间】:2017-02-26 19:52:08
【问题描述】:
我目前正在做一个项目,我通过 https 调用向我们的服务器 api 发送数据。项目的基本 URL 支持 ssl(我们的 url api 端点以 https://api..... 开头)。我正在使用 Retrofit 2 和 OkHttp3 并像这样设置客户端:
public static void buildClient(){
//Misc code here.... not showing for security reasons.
OkHttpClient client = RetrofitClient.configureClient(new OkHttpClient());
//I make calls here to update interceptors, timeouts, etc.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(new Gson()))
.client(client)
.build();
}
//Setup the ssl stuff here
public static OkHttpClient configureClient(final OkHttpClient client) {
final TrustManager[] certs = new TrustManager[]{new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkServerTrusted(final X509Certificate[] chain,
final String authType)
throws CertificateException {
}
@Override
public void checkClientTrusted(final X509Certificate[] chain,
final String authType)
throws CertificateException {
}
}};
SSLContext ssl = null;
try {
ssl = SSLContext.getInstance("TLS");
ssl.init(null, certs, new SecureRandom());
} catch (final java.security.GeneralSecurityException ex) {
}
try {
final HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(final String hostname,
final SSLSession session) {
return true;
}
};
client.setHostnameVerifier(hostnameVerifier);
client.setSslSocketFactory(ssl.getSocketFactory());
} catch (final Exception e) {
}
return client;
}
所以在这之后,我们都准备好了。
现在,这是我所知道的:
1) 我通过 HTTPS 发送,因为如果我不是,服务器会抛出一个错误,但事实并非如此。
2) 我的代码运行良好,因为它正在与服务器通信并且应用程序可以运行。
这里的问题是实际的 Body 数据没有被加密。这里有 2 张照片示例来说明我的意思。
第一张图片显示了对实际正文数据的适当混淆,因为数据正在被转换为加密的“东西”,而第二张图片显示的是纯文本。第二个是我用一个对象向服务器发送一个 POST 调用。
我的问题是,我该如何复制它,以便我的正文像其他文本一样被隐藏/加密?
注意事项:
1) 我正在通过 Proguard 使用混淆
2) 我将 minifyEnabled 设置为 true
3) 我是通过数据包嗅探器发现的
任何人有任何想法如何做到这一点?或者任何人都可以为我指出正确的方向,具体称为什么?
谢谢。
编辑:
所以,我似乎没有理解这里的关键组件。
简短的回答是,呼叫已经加密并且正在发送 Https。
长答案是,我一直在将我的数据调用与以下数据进行比较:
我只是假设 这些 是加密的,而我的不是。事实证明,我发送的呼叫被加密得很好,就像这些一样,但是这些数据被压缩/压缩,这使得它不可读,这让我认为这是加密数据的样子数据包嗅探器。
【问题讨论】:
-
如果数据实际上是通过 HTTPS 发送的,那么除了 URL 的地址部分之外,在线上的所有内容都会被加密。客户端和服务器都不会看到加密数据。除非您已将嗅探器设置为 MITM 代理,否则您也不会在嗅探器中看到未加密的内容。如果您在传输中看到未加密的数据,则说明未使用 HTTPS。
标签: android encryption proguard obfuscation minify