У меня есть мобильное приложение, где я хотел бы хранить секретные ключи безопасно. Требование безопасности подразумевает, что злоумышленникам очень трудно получить закрытый ключ, даже если они имеют неограниченный доступ к мобильному устройству. Для достижения такого уровня безопасности приложение использует симметричную криптографию с ключом, полученным из кодовой фразы, указанной пользователем, и солью, специфичной для устройства.
В идеале это должно быть достаточно безопасным для атаки грубой силы; однако есть два предельных фактора:
-
Поскольку закрытый ключ должен соответствовать определенному формату, процесс дешифрования может проверить результат процесса, чтобы убедиться, что он действителен или нет. Например, если закрытый ключ должен быть закрытым ключом RSA, злоумышленник будет пытаться использовать различные комбинации кодовой фразы и теста, чтобы проверить, может ли он использовать полученный текст как действительный закрытый ключ RSA. Поскольку закрытый ключ RSA должен определенным образом кодировать определенную информацию, если дешифрование не удалось, механизм RSA сигнализирует, что ключ недействителен. Это дает злоумышленнику абсолютно автономный способ проверки его атак. Предпочтительно злоумышленник должен не быть в состоянии сказать, не связываясь с сервером, если его попытка дешифрования была успешной или нет.
-
Поскольку приложение работает на мобильном устройстве, повышенная сложность Key Derivation Function не помогает с "Укрепление ключей" , поскольку автономная атака, которая имеет полный доступ к мобильному устройству, предположительно будет осуществляться на более способном устройстве с более богатыми ресурсами. В ближайшее время любое увеличение числа раундов вычисления функции деривации ключей замедлит работу пользователя (что приемлемо для определенного предела), но будет немедленно сорвано, если атака должна выполняться на настольном компьютере.
Может ли кто-нибудь предложить мне решение этих проблем? В частности, кто-нибудь знает асимметричный алгоритм криптографии, где частный ключ может быть любой случайной последовательностью байтов (это может быть последовательность фиксированной длины, что не имеет значения), и алгоритм все еще сможет создавать зашифрованный текст?