Безопасность JSON для Android

Я разрабатываю проект Android, где мне нужно подключиться к серверной службе С# для получения данных. Я думаю об использовании JSON, чтобы избежать накладных расходов на сообщения SOAP. Как лучше всего реализовать безопасность запроса JSON, чтобы сделать его недоступным для публики и доступным только для выделенных пользователей.

Я думаю о получении токена (или SessionID) с сервера после входа в систему с использованием SSL, и для всех вызовов службы после входа в систему будет использоваться этот токен для аутентификации.

Но как мне использовать токен после входа в систему -

1).через HTTP (легко ли его перехватить?)

2) через HTTP (будет ли проблема с производительностью, если каждый вызов будет осуществляться через HTTP?)

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

ОБНОВЛЕНИЕ!

Приложение Android находится в гибридном режиме, состоящем из веб-просмотров и нативных действий. Как мне поддерживать сеанс, если токен основан на сеансе? Пользователь может просто войти в систему и быть неактивным в течение длительного периода времени. Должен ли я просто увеличить время ожидания сеанса?


person Riddle    schedule 21.08.2011    source источник
comment
ну, ради безопасности Джейсона, ты можешь попробовать не ложиться спать. Ссылка: en.wikipedia.org/wiki/Jason_Voorhees   -  person Jon Willis    schedule 21.08.2011
comment
Яп, извините, это JSON: D Обновлено!   -  person Riddle    schedule 21.08.2011
comment
ха-ха, теперь мой пост выглядит довольно глупо. Хотя держу.   -  person Jon Willis    schedule 21.08.2011


Ответы (3)


Я бы предложил использовать SSL даже после того, как вы приобрели токен. Наша компания занимается проектами с банками и безопасными данными, связанными со здоровьем, и мы обязаны использовать SSL даже после внедрения токена. Мы обнаружили, что производительность остается в разумных пределах даже после использования https.

Использование Https не будет огромным ударом по производительности, особенно если учесть, что кто-то может перехватить ваш пакет и получить токен (учитывая, что мы не знаем точку доступа, к которой может подключаться пользователь).

Накладные расходы, связанные с SSL, возникнут во время начального рукопожатия, поскольку в основном необходимо обмениваться ключом и алгоритмом шифрования через RSA. Однако после того, как вы пройдете это начальное рукопожатие, стоимость будет связана только с шифрованием/дешифрованием пакета, и это не окажет большого влияния на ваше приложение.

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

person momo    schedule 21.08.2011
comment
+1 ssl — правильное решение, и сертификат на стороне клиента может помочь. - person rook; 21.08.2011
comment
@momo Я собираюсь попробовать это, хочу задать несколько вопросов о SSL, так как я использую его впервые. Произошло ли рукопожатие только для первого запроса, а для последовательных запросов к другим https-страницам оно будет запрашиваться напрямую без рукопожатия? - person Riddle; 23.08.2011
comment
@Riddle Да, это правильно. Первоначальное согласование происходит с помощью алгоритма открытого и закрытого ключа RSA. По сути, в первый раз сервер отправляет свой открытый ключ. Используя это, клиент отправляет обратно ключ шифрования для последующих коммуникаций. Ключ шифрования зашифрован с использованием открытого ключа сервера, поэтому только сервер может расшифровать его обратно, используя свой закрытый ключ. После того, как ключ шифрования и алгоритм установлены, остается только зашифровать и расшифровать сообщение. - person momo; 23.08.2011
comment
@momo, не могли бы вы также взглянуть на мой еще один вопрос ? - person Riddle; 28.08.2011

SSL немного повлияет на производительность, но не слишком сильно (из того, что я испытал). Я бы использовал полузащищенный хеш на основе чего-то вроде этого:

MD5SUM или SHA1 следующее: сегодняшняя дата + некоторые знаки препинания + что-то уникальное о пользователе (возможно, электронная почта и т. д.). Это даст вам длинную строку, похожую на ajadfh28dfj2yadsfh28… Пока ваша сторона Android отправляет ее так же, как ее ожидает серверная сторона, и она уникальна для пользователей, для меня это было бы довольно безопасно.

person jschorr    schedule 21.08.2011
comment
dood, md5 и sha1 сломаны. Не рекомендуйте сломанные примитивы экспертам по безопасности. - person rook; 21.08.2011
comment
Тогда я исправляюсь. Извините, я больше не слежу за этим. Что вы порекомендуете - SHA2 может быть? - person jschorr; 22.08.2011
comment
спасибо, у меня есть sha2 в 2 проектах и ​​я полностью перейду к этому - person jschorr; 22.08.2011
comment
Ребята, не могли бы вы также взглянуть на мой еще один вопрос? - person Riddle; 28.08.2011

Чтобы сделать это рекомендованным WCF/Microsoft способом, вы реализуете авторизацию WCF с использованием поставщика ролей.

Это включает в себя IPrincipal и внедрение вашего пользовательского принципала, у которого будут роли, загруженные из базы данных, LDAP и т. д.

Тогда любые методы WCF можно просто так оформить для авторизации:

[PrincipalPermission(SecurityAction.Demand, Role = "ADMIN")]
[PrincipalPermission(SecurityAction.Demand, Role = "OPERATOR")]
public void SomeServiceCall(string foo)
{
    // In your case this would be an AJAX endpoint, not a void method
}

Это защитит вызовы службы; вызывающему абоненту они даже не будут казаться существующими.

Отправные точки: http://msdn.microsoft.com/en-us/library/ff647040.aspx Microsoft предоставляет исходный код примера поставщика ролей.

Имейте также в виду, что не обязательно реализовывать поставщика полного членства, хотя многие так думают. Для этого вам нужен только собственный валидатор и поставщик ролей. Большая часть поставщика членства может быть оставлена ​​нереализованной.

person codenheim    schedule 21.08.2011