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

Среда выполнения Adobe® AIR® предоставляет надежное зашифрованное локальное хранилище (encrypted local store, ELS) для каждого приложения AIR, установленного на компьютере пользователя. Это позволяет сохранять и извлекать данные, хранящиеся на жестком диске пользователя в зашифрованном виде, при этом другие пользователи не смогут расшифровать эти данные обычными методами. Для каждого приложения AIR используется отдельное зашифрованное локальное хранилище, и для каждого пользователя такого приложения также используется отдельное локальное зашифрованное хранилище.

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

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

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

Информация в зашифрованном хранилище доступна только приложениям 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 имеет значение 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();