Безопасно хранить строку пароля в Objective-C

У меня есть приложение iOS, которое я разрабатываю, и приложение должно быть связано с сертификатом, чтобы использовать приложение, поскольку оно использует веб-просмотр, и доступ к сайту без сертификата невозможен.

В настоящее время у меня есть рабочее решение, но я заметил, что при распаковке файла .ipa и просмотре кода я очень четко вижу пароль для сертификата, как вы можете видеть из этой строки из скомпилированного кода:

lastSampleTimeMainjsbundlecertificatep12PASSWORDHEREGCDAsyncSocketErrorDomain

Краткий фрагмент кода того, как я получаю сертификат:

[[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"p12"];
 
 NSData *p12Data = [[NSData alloc] initWithContentsOfFile:p12Path];
 CFStringRef password = CFSTR("somePassword");

Есть ли безопасный способ справиться с этим типом сценария? Или пароль всегда можно будет восстановить, если он попадет в руки того, кто знает, что делает.

Может быть фиктивный вопрос, но зачем вам пароль, если у вас есть сертификат?

Ptit Xav 21.10.2022 12:08

Используйте службы цепочки для ключей, чтобы обеспечить простое и безопасное хранение паролей пользователей. Таким образом, вы избегаете повторного запроса пароля у пользователя, и вам не нужно реализовывать собственное шифрование, которое может быть подвержено ошибкам. developer.apple.com/documentation/security/keychain_services‌​/…

Sourabh Shekhar 28.10.2022 14:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
158
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Простым решением может быть просто запутать строку, создав строку пароля из массива байтов, но это все еще не очень безопасно.

Некоторое объяснение здесь. Также следует учитывать, что следует избегать загрузки пароля в строку, так как он может быть прочитан из кучи во время выполнения: https://stackoverflow.com/a/8881376/20283130

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

SmalliSax 26.10.2022 15:33

@SmalliSax Я не думаю, что вы можете увидеть чистый текст пароля в скомпилированном коде, если пароль был преобразован в массив байтов. Вы сделали какую-то ошибку?

user2027712 27.10.2022 09:16

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

MJG 27.10.2022 16:51

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

SmalliSax 27.10.2022 23:20

Может случиться так, что когда ваш код вычисляет строку из массива, в конечном итоге компилятор оптимизирует и «разрешит» операцию, чтобы напрямую отразить окончательную строку. Действительно, лучше никогда не загружать открытый пароль в строку. Правильным решением может быть предложение использовать Keychain API, если это не слишком сложно для вашей цели.

MJG 30.10.2022 09:49

Используйте 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

Другие вопросы по теме