Есть несколько проблем с кодом. Прежде всего, вы действительно должны использовать генератор ключей для генерации секретных ключей. Простое использование некоторого текста напрямую может работать для некоторых алгоритмов, но у других есть слабые ключи и т. Д., Которые необходимо проверить.
Даже если вы хотите выполнить шифрование на основе пароля, пароль должен быть запущен с помощью алгоритма получения ключа для получения ключа, как показано в мой ответ на вопрос, который вы уже цитировали.
Кроме того, вы не должны использовать метод no-arg getBytes()
из String
. Это зависит от платформы. Если все строки, которые вы кодируете, содержат только символы из набора символов US-ASCII, сделайте это ясно, указав эту кодировку явно. В противном случае, если телефонная и серверная платформы используют разные кодировки символов, ключ и IV не получатся одинаковыми.
Для режима CBC лучше использовать новый IV для каждого отправляемого сообщения. Обычно CBC IVs генерируются случайным образом. Другие режимы, такие как CFB и OFB , требуют уникальных IV для каждого сообщения. IV обычно отправляются вместе с зашифрованным текстом - IV не нужно хранить в секрете, но многие алгоритмы сломаются, если будет использоваться предсказуемый IV.
Серверу не нужно получать секрет или IV напрямую с телефона. Вы можете настроить сервер с секретным ключом (или паролем, из которого получен секретный ключ), но во многих приложениях это будет плохим дизайном.
Например, если приложение будет развернуто на телефонах нескольких людей, для них не будет хорошей идеей использовать один и тот же секретный ключ. Один злоумышленник может восстановить ключ и сломать систему для всех.
Лучшим подходом является генерация новых секретных ключей на телефоне и использование алгоритма согласования ключей для обмена ключами с сервером. Для этого можно использовать соглашение о ключе Диффи-Хеллмана или секретный ключ можно зашифровать с помощью RSA и отправить на сервер.
Обновление:
Диффи-Хеллман в «эфемерно-статическом» режиме (и в «статически-статическом» режиме тоже, хотя это и менее желательно) возможен без первоначального сообщения от сервера на телефон, если встроенный открытый ключ сервера в приложении.
Открытый ключ сервера не представляет такой же риск, как встраивание общего секретного ключа в телефон. Поскольку это открытый ключ, угроза будет заключаться в том, что злоумышленник получит (или удаленно взломает) телефон и заменит настоящий открытый ключ поддельным ключом, который позволяет ему выдавать себя за сервер.
Можно использовать статически-статический режим, но на самом деле он более сложный и немного менее безопасный. Каждому телефону потребуется своя уникальная пара ключей, иначе вы снова столкнетесь с проблемой секретного ключа. По крайней мере, серверу не нужно было бы отслеживать, какой телефон имеет какой ключ (при условии, что на уровне приложения есть какой-то механизм аутентификации, например пароль).
Я не знаю, насколько быстрые телефоны. На моем рабочем столе генерация пары эфемерных ключей занимает около 1/3 секунды. Генерация параметров Диффи-Хеллмана очень медленная; Вы определенно хотели бы повторно использовать параметры из ключа сервера.