Подтвердить что ты не робот

В iOS, как я могу хранить секретный "ключ", который позволит мне общаться с моим сервером?

Я хочу хранить секретный ключ ( "abc123" ), который я буду использовать в заголовке моих запросов REST API. Мой сервер проверит этот секретный ключ. Если он соответствует "abc123", то разрешите сделать запрос.

Я думаю о простом решении вроде:

let secret = "abc123" 

Но будут ли какие-либо проблемы с этим?

4b9b3361

Ответ 1

Сумасшедший, поскольку это звучит, это, вероятно, лучшее решение. Все остальное сложнее, но не намного безопаснее. Любые причудливые методы обфускации, которые вы используете, просто будут реконструированы почти так же быстро, как они найдут этот ключ. Но это статическое ключевое решение, в то время как дико небезопасно, почти столь же безопасно, как и другие решения, но при этом практически не требует дополнительной сложности. Мне это нравится.

Он будет разбит почти сразу, но так же будут и другие решения. Так что держите это просто.

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

Маловероятно, что любое усилие, превышающее час, будет стоить труда для реализации этой функции. Если вы хотите узнать больше о теме, см. Защитить https-шифрование для iPhone-приложения на веб-странице и его ссылки.

Ответ 2

Путем жесткого кодирования строки в вашем приложении злоумышленники могут дешифровать ваш двоичный файл (с помощью таких инструментов, как dumpdecrypt) и без проблем получить вашу строку (простой hexdump будет включать любые строки в вашем приложении).

Есть несколько обходных путей для этого. Вы могли бы реализовать конечную точку в вашем REST API, которая возвращает ваши учетные данные, которые вы могли бы затем вызвать при запуске. Конечно, это имеет свои нетривиальные проблемы безопасности и требует дополнительного HTTP-вызова. Я бы обычно так не делал.

Другой вариант - каким-то образом запутать секретный ключ. Таким образом, злоумышленники не смогут мгновенно распознать ваш ключ после расшифровки. cocoapods-keys - это одна из опций, которая использует этот метод.

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

(Также обязательно используйте HTTPS при отправке запросов, иначе это еще один хороший способ скомпрометировать ваши ключи.)

Ответ 3

В то время как токены внутри диапазона обычно используются для некоторых схем, вы, вероятно, в конечном итоге собираетесь внедрять TLS для защиты сетевого трафика и токенов. Это как Роб Напир упоминает в другом ответе.

Использование собственной цепи сертификатов позволяет использовать существующие механизмы безопасности и аутентификации TLS и keychain iOS, а также дает вам возможность отменить учетные данные TLS, если (когда?) становится необходимым, а также позволяет клиенту подключаться его подключения к вашим серверам и обнаружение спуфинга сервера, если это становится необходимым.

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

Короче говоря, этот подход на основе сертификатов объединяет шифрование и аутентификацию с использованием существующих механизмов TLS.

Ответ 4

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

Ответ 5

Я использовал объект PFConfig (словарь), который позволяет извлекать в значениях приложения значения переменных, хранящихся как параметры среды сервера.
Подобно переменным среды, которые могут быть получены с использованием ENV в программировании на стороне сервера, например Ruby или PHP. По-моему, это примерно так же безопасно, как использование переменных среды в Ruby или аналогичных.

PFConfig.getConfigInBackgroundWithBlock{
      (config: PFConfig?, error: NSError?) -> Void in
      if error == nil {
        if let mySecret = config["mySecret"] as? String {
          // myFunction(mySecret)
        }

    }

Ответ 6

Если вы сохраните его таким образом, и если кто-то начнет с вашим приложением, он сможет получить доступ к вашему секретному ключу. Я бы порекомендовал вам начать хранить ваш секрет как #define или пользовательский по умолчанию (так что вы можете сначала создать свое приложение), и как только вы приблизитесь к представлению приложения, используйте keychain Вот пример ответа