Защита базы данных SQLite - PullRequest
       18

Защита базы данных SQLite

4 голосов
/ 31 августа 2011

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

Проблема в том, что я не могу получить ключ подписи во время выполнения: что бы я ни делал, CodeSigningKey.get(...) всегда возвращает null.

Это мой код:

    final CodeSigningKey key = CodeSigningKey.get(AbstractDB.class);
    if (key != null) {
        Log.d("+ GOT SIGNING KEY");
        final DatabaseSecurityOptions secopt = new DatabaseSecurityOptions(key);
        db = DatabaseFactory.create(name,  secopt);
    } else {
        Log.d("- SIGNING KEY IS NULL");
    }

Я скачал Signing Authority Tool и создал TEST.key, используя его, и поместил его в {project_root}/keys/TEST.key в моем проекте Eclipse.

Кроме того, я дважды щелкнул TEST.key в Eclipse и выбрал AbstractDB класс для подписи.

Я запускаю свое приложение на реальном устройстве, а не на симуляторе.

Я запускаю его следующим образом:

  1. начать отладку на устройстве - это инициирует упаковку и получение файла .cod. (Однако в окне инструмента подписи я получаю предупреждение о моем ключе TEST.key: «Не зарегистрирован» и «Пожалуйста, свяжитесь с подписывающим лицом и зарегистрируйтесь в Органе подписи.»)

  2. с помощью Инструмента подписи. Я подписываю свой файл .cod, полученный на шаге 1, с помощью моего TEST.key

  3. Я снова нажимаю «Отладка на устройстве», и инструмент подписи снова подписывает основной файл .cod, а затем приложение запускается на устройстве.

Однако ключ, который я получаю от CodeSigningKey.get(..), всегда null.

Что я делаю не так?

Решение

После подсказки от Майкла я смог решить эту проблему.

Прежде всего, действительно, мне нужен был экземпляр объекта в CodeSigningKey.get(...). Однако есть одна вещь, о которой вы должны знать: если ваш объект расширяет некоторые классы и / или реализует некоторые интерфейсы, то ВСЕ из них должны быть подписаны одним и тем же ключом для работы. Если какой-либо из классов / интерфейсов предков не подписан, вы получите null.

Это может быть проблемой, если ваша иерархия достаточно глубока. Информация о том, какие классы подписаны, какие ключи хранятся в BlackBerry_App_Descriptor.xml, и копируется в параметры инструмента подписи, когда вы нажимаете Отладка. Может случиться, что командная строка становится слишком длинной, поэтому средство подписи завершается неудачно с сообщением «Invalid parameter» в консоли.

Итак, я специально извлек класс для подписи:

final public class SignatureClass {
    private static final SignatureClass INSTANCE = new SignatureClass();

    private SignatureClass() { }

    public static CodeSigningKey getKey() {
        return CodeSigningKey.get(INSTANCE);
    }
}

Я подписываю только этот класс своим ключом и использую SignatureClass.getKey(), чтобы получить ключ.

PS: Кроме того, если вы перемещаете / переименовываете классы или ключи, убедитесь, что ссылки для подписи в BlackBerry_App_Descriptor.xml действительны. Они не обновляются автоматически.

Обновление

Как правильно оформить собственный подписывающий ключ.

В процессе, который я описал выше, мне пришлось подписать файл .cod отдельным инструментом, потому что встроенный инструмент подписи выдал ошибку «Не зарегистрирован» для моего TEST.key. Чтобы это исправить и автоматически подписать ваш .cod, выполните следующие действия.

  1. После того, как вы создали ключ с помощью Signing Authority Tool, запустите утилиту WebAdmin, включенную в это приложение. Он предлагает вам создать базу данных ключей и запустить сервис WebSigner.

  2. После успешного запуска WebAdmin откройте меню Record->Add. Вы получите окно, где вы можете создать файл .csi. Настроить: количество запросов - бесконечно; срок годности - никогда; уведомления по электронной почте - нет; файл CSI электронной почты - нет. Нажмите OK, и вы увидите диалоговое окно с сгенерированным PIN-кодом - сохраните его для будущего использования. Файл .csi создается и сохраняется в папке / data в средстве подписи.

  3. Установите файл .csi с помощью Eclipse->Window->Preferences->BlackBerry plugin->Signature Tool->Install new keys и зарегистрируйте его с помощью PIN-кода с шага 2.

Готово. Отныне, когда вы подписываете ключами RIM, ваш .cod автоматически подписывается и вашим ключом.

1 Ответ

2 голосов
/ 31 августа 2011

Я считаю, что вам нужен экземпляр объекта из вашего приложения, а не объект класса. В этом случае «это» должно работать.

...