У меня есть приложение iOS, которое я разрабатываю, и приложение должно быть связано с сертификатом, чтобы использовать приложение, поскольку оно использует веб-просмотр, и доступ к сайту без сертификата невозможен.
В настоящее время у меня есть рабочее решение, но я заметил, что при распаковке файла .ipa и просмотре кода я очень четко вижу пароль для сертификата, как вы можете видеть из этой строки из скомпилированного кода:
lastSampleTimeMainjsbundlecertificatep12PASSWORDHEREGCDAsyncSocketErrorDomain
Краткий фрагмент кода того, как я получаю сертификат:
[[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"p12"];
NSData *p12Data = [[NSData alloc] initWithContentsOfFile:p12Path];
CFStringRef password = CFSTR("somePassword");
Есть ли безопасный способ справиться с этим типом сценария? Или пароль всегда можно будет восстановить, если он попадет в руки того, кто знает, что делает.
Используйте службы цепочки для ключей, чтобы обеспечить простое и безопасное хранение паролей пользователей. Таким образом, вы избегаете повторного запроса пароля у пользователя, и вам не нужно реализовывать собственное шифрование, которое может быть подвержено ошибкам. developer.apple.com/documentation/security/keychain_services/…
Простым решением может быть просто запутать строку, создав строку пароля из массива байтов, но это все еще не очень безопасно.
Некоторое объяснение здесь. Также следует учитывать, что следует избегать загрузки пароля в строку, так как он может быть прочитан из кучи во время выполнения: https://stackoverflow.com/a/8881376/20283130
Я пытался пойти разными путями, зашифровав строку и расшифровав ее во время выполнения, и даже преобразовал ее в массив байтов, но скомпилированный код всегда показывает пароль в открытом тексте после того, как он был загружен с сертификатом. Я начинаю думать, что нет никакого "безопасного" способа сделать это.
@SmalliSax Я не думаю, что вы можете увидеть чистый текст пароля в скомпилированном коде, если пароль был преобразован в массив байтов. Вы сделали какую-то ошибку?
Не могли бы вы попробовать очистить продукт полной сборки и собрать заново, пожалуйста? Также полностью ищите строку по всему проекту, так как ее можно взять и из какого-то другого места, даже если вы, кажется, уже пробовали с разными строками, верно?
Я вполне мог допустить какую-то ошибку, но что показалось мне странным, так это то, что, несмотря на то, что я зашифровал строку и расшифровал ее одновременно, пароль всегда был в открытом виде в скомпилированном коде. Я убедился, что пароль не сохраняется в другом месте. Однако мне удалось зашифровать строку с помощью библиотеки шифрования, получить результат, а затем использовать его для расшифровки в приложении. Таким образом, единственная видимая строка теперь является выходом из зашифрованной строки, если это имеет смысл. По крайней мере, так немного надежнее
Может случиться так, что когда ваш код вычисляет строку из массива, в конечном итоге компилятор оптимизирует и «разрешит» операцию, чтобы напрямую отразить окончательную строку. Действительно, лучше никогда не загружать открытый пароль в строку. Правильным решением может быть предложение использовать Keychain API, если это не слишком сложно для вашей цели.
Используйте API связки ключей.
https://developer.apple.com/documentation/security/keychain_services
Это стандартный способ защиты API_KEYS, сертификатов, даже имени пользователя и пароля.
Это просто и совместимо с Objective-C
Обновлено: Для сертификатов: https://developer.apple.com/documentation/security/certificate_key_and_trust_services/certificates/storing_a_certificate_in_the_keychain
Может быть фиктивный вопрос, но зачем вам пароль, если у вас есть сертификат?