2015-12-05 6 views
2

В настоящее время я пишу свое первое приложение для Android и решил использовать конечные точки Google. меня защитить мои методы Серверных конечных точек, следуя эту документацию: https://cloud.google.com/appengine/docs/java/endpoints/auth, https://cloud.google.com/appengine/docs/java/endpoints/gen_clients, https://cloud.google.com/appengine/docs/java/endpoints/consume_androidКак избежать атаки «человек-в-середине» при использовании конечных точек Google Cloud?

В основном вы должны генерировать WEB_CLIENT_ID и ANDROID_CLIENT_ID для конечных точек, добавить пары пользователя на каждый метод вы хотите, чтобы обеспечить и, наконец, проверить внутри метода, который пользователь не имеет значение NULL, иначе throw OAuthRequestException.

У меня есть построить клиент андроид библиотеку и настроить его, как это в моем андроиде приложении:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); 
String accountName = preferences.getString(MainActivity.PREF_ACCOUNT_NAME, null); 

GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(context, 
         "server:client_id:xxxxxxxxx-xxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com"); 

credential.setSelectedAccountName(accountName); 

DataLoaderApi.Builder builder = new DataLoaderApi.Builder(AndroidHttp.newCompatibleTransport(), 
         new AndroidJsonFactory(), credential); 

На первом взгляд кажется, работает очень хорошо, вы не можете использовать методы бэкэнда без удостоверения. (Вы будете иметь 401 сообщение об ошибке)

К сожалению, я заметил, что все еще можно расшифровать запрос HTTPS/ответ серверными конечными точками, если вы используете инструмент, как «Charles Proxy» (https://www.charlesproxy.com/). Вам просто нужно установить сертификат прокси-сервера charles на свой смартфон и настроить прокси-сервер.

Вот еще одно описания тех же проблемы: http://nickfishman.com/post/50557873036/reverse-engineering-native-apps-by-intercepting-network

Теперь у вас есть конечные точки URL, используемое андроид приложение, вы получите все из параметров посланных в каждом запросе и все свойства заголовка даже авторизация свойства с маркером, поэтому в основном все сведения, которые вам нужны для использования моих конечных точек в вашем приложении. :( Я знаю, что маркер истекает через некоторое время, но в то же время вы можете извлечь мои ДАННЫЕ

Google говорит о том, что в Google облако магазина документ:. https://cloud.google.com/storage/docs/concepts-techniques#bestpractices

«Убедитесь, что вы используете Библиотека HTTPS, которая проверяет сертификаты сервера. Отсутствие проверки сертификата сервера делает ваше приложение уязвимым для атак типа «человек в середине» или других атак ».

Отлично, но когда вы используете клиентскую библиотеку конечных точек, сгенерированную с помощью своего инструмента, вы уязвимы также.

Я знаю, что есть решение, чтобы избежать этой проблемы: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning

Но как я могу использовать сгенерированный оконечные клиента андроид библиотеку и избежать человек-в-середине атаки?

ответ

0

Создайте свой собственный KeyStore и поместите в него только системные сертификаты. Системные сертификаты системы Android могут быть получены от here.

Создать TrustManager и SSLSocketFactory, который будет доверять только этот KeyStore, который вы только что создали, ссылочный из this:

// Load CAs from an InputStream 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
InputStream caInput = new BufferedInputStream(new FileInputStream("load-der.crt")); 
Certificate ca; 
try { 
    ca = cf.generateCertificate(caInput); 
    System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN()); 
} finally { 
    caInput.close(); 
} 

// Create a KeyStore containing our trusted CAs 
String keyStoreType = KeyStore.getDefaultType(); 
KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
keyStore.load(null, null); 
keyStore.setCertificateEntry("ca", ca); 

// Create a TrustManager that trusts the CAs in our KeyStore 
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
tmf.init(keyStore); 

// Create an SSLContext that uses our TrustManager 
SSLContext context = SSLContext.getInstance("TLS"); 
context.init(null, tmf.getTrustManagers(), null); 

SSLSocketFactory ssf = context.getSocketFactory(); 

Создать NetHttpTransport используя NetHttpTransport.Builder и набор созданного SSLSocketFactory выше.После этого вы можете использовать метод конечных точек строителя, как обычно:

Api.Builder builder = new Api.Builder(objNetHttpTransport, 
        new AndroidJsonFactory(), credential); 

Это должно работать, только ВЕРАМИ это в управлении корневыми сертификатами. Вам нужно будет регулярно отправлять обновления.