Как скрыть открытый ключ на Android?

#java #android #security #key

#java #Android #Безопасность #Клавиша

Вопрос:

В руководстве по безопасности Android говорится, что хранить открытый ключ (используемый для Android Market) небезопасно только в виде строки, и его следует каким-то образом скрыть / закодировать. Может кто-нибудь, пожалуйста, привести мне пример, как это можно сделать?

(У меня нет отдельного сервера, поэтому он не может быть сохранен там)

Upd. Полагаю, это довольно распространенная задача, связанная не только с Android, но и с другими приложениями.

Комментарии:

1. Вы уверены, что не имеете в виду закрытый ключ? Злоумышленник мало что может сделать с открытым ключом.

2. Я говорю об открытом ключе из учетной записи издателя. developer.android.com/guide/market/billing /… : Чтобы защитить ваш открытый ключ от злоумышленников и хакеров, не вставляйте ваш открытый ключ в виде целой буквенной строки. Вместо этого создайте строку во время выполнения из фрагментов или используйте битовые манипуляции (например, XOR с какой-либо другой строкой), чтобы скрыть фактический ключ. Сам ключ не является секретной информацией, но вы же не хотите, чтобы хакеру или злоумышленнику было легко заменить открытый ключ другим ключом.

3. Вы могли бы попробовать задать этот вопрос по адресу security.stackexchange.com . Там есть настоящие эксперты по этому вопросу…

4. Открытые ключи должны быть «общедоступными» и распространяться совместно и т.д. Отсюда и название public keys.

5. Это правильно, но вы не хотите упрощать замену открытого ключа другим.

Ответ №1:

Соответствующий текст с страницы, на которую вы ссылались, выглядит следующим образом:

Важно: Чтобы защитить ваш открытый ключ от злоумышленников и хакеров, не вставляйте ваш открытый ключ в виде целой строки литерала. Вместо этого создайте строку во время выполнения из фрагментов или используйте битовые манипуляции (например, XOR с какой-либо другой строкой), чтобы скрыть фактический ключ. Сам ключ не является секретной информацией, но вы же не хотите, чтобы хакеру или злоумышленнику было легко заменить открытый ключ другим ключом.

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

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

Комментарии:

1. Я действительно этого не понимаю. Итак, вместо того, чтобы иметь String base64EncodedPublicKey = "thisIsMyKey"; , безопаснее ли иметь String one="thisIs"; String two="MyKey"; String base64EncodedPublicKey = one two; ?

2. @TheBeatlemaniac, что-то подобное было бы минимумом, который они предлагают. У злоумышленника есть свой собственный открытый ключ, и он хочет найти ваш и заменить его своим. Чем больше вы разбиваете свой ключ и манипулируете им, тем больше работы приходится проделывать злоумышленнику, чтобы заменить его. Однако, как я уже сказал, ничто из этого не остановит действительно решительного злоумышленника.

Ответ №2:

Если вы используете утилиту Keytool, все это делается за вас. Вы получите .keystore файл на вашем локальном компьютере, содержащий ваш закрытый ключ (ы), зашифрованный паролем; храните этот файл и пароль в секрете, и вы в безопасности.

http://developer.android.com/guide/publishing/app-signing.html

На самом деле, я полагаю, что плагин Android для Eclipse даже делает все это за вас автоматически.

Комментарии:

1. пожалуйста, проверьте мой первый комментарий к вопросу — я говорю об открытом ключе.

Ответ №3:

Для открытого ключа вы можете хэшировать его и сохранять как хэш-значение. Еще лучше было бы заменить хэш-значение чем-то, что вы знали бы, когда вам нужно будет вернуть хэшированное значение обратно. Может быть что-то вроде имени пользователя или ESN. Посмотрите на android.телефония.TelephonyManager.getDeviceId()

Комментарии:

1. Это не решение, потому что ему, по-видимому, в какой-то момент нужно вернуть открытый ключ. 1 способ этого не сделает.