Зашифрованная локальная система хранения данных

Класс EncryptedLocalStore (ELS) представляет собой механизм локального хранения зашифрованных данных, который может использоваться в качестве кэша небольшого размера для хранения закрытых данных приложения. К данным ELS нельзя получить доступ из других приложений. Смысл класса ELS в том, чтобы позволить приложениям хранить легко восстанавливаемые элементы, в частности, имена и пароли учетных записей и другую конфиденциальную информацию. Данные ELS нельзя считать постоянными, как описано ниже в разделах «Ограничения локального зашифрованного хранилища» и «Рекомендации по оптимальному использованию ELS».

Примечание. В дополнение к зашифрованному локальному хранилищу Adobe AIR также предлагает шифрование содержимого, хранимого в базах данных SQL. Дополнительные сведения см. в разделе « Использование шифрования с базами данных SQL ».

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

На стационарных компьютерах для установления связи зашифрованного локального хранилища с каждым приложением и пользователем AIR использует интерфейс DPAPI в ОС Windows, KeyChain в ОС Mac OS и iOS, а также KeyRing или KWallet в ОС Linux. Для шифрования локального хранилища используется 128-битный алгоритм шифрования AES-CBC.

В ОС Android данные, сохраняемые классом EncryptedLocalStorage, не шифруются. Вместо этого защита данных обеспечивается на уровне пользователя системой безопасности ОС. ОС Android присваивает каждому приложению индивидуальный идентификатор пользователя. Приложения имеют доступ только к собственным файлам и файлам, созданным в общедоступных папках, таких как съемная карта памяти). Обратите внимание, что на «взломанных» устройствах Android приложения, выполняемые с правами суперпользователя, МОГУТ получать доступ к файлам других приложений. Таким образом, на взломанных устройствах зашифрованное локальное хранилище не обеспечивает такого высокого уровня защиты данных, как на невзломанных.

Информация в зашифрованном хранилище доступна только приложениям AIR в своей изолированной программной среде.

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

  • Элементы были добавлены с параметром stronglyBound в значении true

  • Существующая и обновленная версии опубликованы до AIR 1.5.3, и обновление имеет подпись миграции.

Ограничения зашифрованного локального хранилища

Данные в зашифрованном локальном хранилище защищены параметрами доступа пользователя. Другие лица не могут получить доступ к данным, находящимся в хранилище, если они не могут войти под именем данного пользователя. Однако данные недостаточно хорошо защищены от доступа других приложений, запускаемых прошедшим проверку подлинности пользователем.

Поскольку подлинность пользователя должна быть установлена, чтобы эти атаки сработали, личные данные пользователя, тем не менее, остаются защищенными (если сама учетная запись пользователя не оказалась раскрыта). Однако данные, которые ваше приложение должно держать в секрете от пользователей, например ключи, используемые для лицензирования или управления цифровыми правами, не находятся в безопасности. Таким образом, ELS — неподходящее место для хранения такой информации. Это подходит для хранения личных данных пользователя, например паролей.

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

Параметр stronglyBound в значении true использовать не рекомендуется. Значение true данного параметра не обеспечивает дополнительного уровня защиты данных. Кроме того, при обновлении приложения доступ к данным становится невозможным, даже при сохранении исходного идентификатора издателя.

Скорость работы зашифрованного локального хранилища может снижаться, если объем хранимых данных превышает 10 МБ.

При установке приложения AIR программа-деинсталлятор не удаляет файлы из локального хранилища.

Передовой опыт

Для наиболее эффективного использования ELS соблюдайте следующие рекомендации.

  • Используйте ELS для хранения важнейших данных пользователя, таких как пароли (при значении false параметра stronglyBound).

  • Не используйте ELS для хранения секретов приложений, таких как ключи системы управления цифровыми правами или маркеры лицензий.

  • Необходимо обеспечить приложению возможность восстановить данные, хранящиеся в ELS, в случае потери данных ELS. Например, этого можно добиться путем запроса на повторный ввод параметров доступа данного пользователя.

  • Не используйте параметр stronglyBound .

  • Если параметру stronglyBound присвоено значение true , то не перемещайте данные в хранилище во время обновления. Вместо этого после обновления создайте хранилище данных заново.

  • Не сохраняйте в хранилище значительные объемы данных. Для объемных данных лучше всего использовать зашифрованную базу данных AIR SQL.

Помещение данных в зашифрованное локальное хранилище

Для помещения данных в локальное хранилище используйте статический метод setItem() класса EncryptedLocalStore. Данные хранятся в хэш-таблице с ключами-строками; данные сохраняются в виде байтовых массивов.

Например, в коде ниже строка сохраняется в зашифрованном локальном хранилище:

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes);

Третий параметр метода setItem() stronglyBound — не является обязательным. Если этот параметр принимает значение true , то зашифрованное локальное хранилище привязывает хранящиеся в нем элементы к цифровой подписи сохраняющего приложения AIR и его битам:

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes, false); 

Если значение свойства stronglyBound элемента равно true , последующие вызовы метода getItem() будут возможны, только если вызов осуществляется тем же приложением AIR, что и сохранение (если данные в файлах каталога приложения не менялись). Если вызывающее приложение AIR отличается от сохраняющего, то при вызове метода getItem() для элемента с сильной связью генерируется исключение Error. При обновлении приложения данные с сильной связью, ранее записанные в зашифрованное локальное хранилище, нельзя будет считать. Установка для stronglyBound значения true игнорируется на мобильных устройствах. Этот параметр всегда обрабатывается так, будто ему задано значение false .

Если параметр stronglyBound имеет значение false (по умолчанию), то для считывания данных должен оставаться без изменения только идентификатор издателя приложения. Биты приложения могут измениться (и они должны быть подписаны тем же издателем), но они могут не совпадать с битами в приложении, сохранившем данные. Обновленные приложения с тем же идентификатором издателя, что и у исходного приложения, по-прежнему будут иметь доступ к данным.

Примечание. На практике параметр stronglyBound в значении true не добавляет дополнительного уровня защиты данных. Таким образом, злоумышленник может внести изменения в приложение для получения доступа к данным, хранящимся в ELS. Кроме того, данные защищены от внешних угроз, не исходящих от пользователя, независимо от того, принимает ли параметр stronglyBound значение true или false . Поэтому устанавливать для параметра stronglyBound значение true не имеет смысла.

Доступ к данным, находящимся в зашифрованном локальном хранилище

Значение может быть извлечено из зашифрованного локального хранилища методом EncryptedLocalStore.getItem() , как показано ниже:

var storedValue:ByteArray = EncryptedLocalStore.getItem("firstName"); 
trace(storedValue.readUTFBytes(storedValue.length)); // "Bob" 

Удаление данных, находящихся в зашифрованном локальном хранилище

Значение может быть удалено из зашифрованного локального хранилища методом EncryptedLocalStore.removeItem() , как показано ниже:

EncryptedLocalStore.removeItem("firstName"); 

Все данные могут быть удалены из зашифрованного локального хранилища методом EncryptedLocalStore.reset() , как показано ниже:

EncryptedLocalStore.reset();