【问题标题】:Protecting the SQLite database保护 SQLite 数据库
【发布时间】:2011-09-06 19:19:09
【问题描述】:

在我的应用程序中,我有一个数据库,必须使用密钥保护该数据库,以限制此设备上的其他应用程序访问它。

问题是我无法在运行时获取签名密钥:无论我做什么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");
    }

我已经下载了签名授权工具并使用它创建了一个TEST.key,并将它放在我的Eclipse项目中的{project_root}/keys/TEST.key中。

另外,我在 Eclipse 中双击了 TEST.key 并选择了要使用它签名的 AbstractDB 类。

我在真实设备上运行我的应用程序,而不是在模拟器中。

我运行如下:

  1. 在设备上开始调试 - 这会启动 .cod 文件的打包和签名。 (但是,在签名工具窗口中,我收到有关我的 TEST.key 的警告:“未注册”和“请联系签名者并在签名机构注册。”)

    李>
  2. 使用签名授权工具,我使用我的 TEST.key 对在步骤 1 中获得的 .cod 文件进行签名

  3. 我再次点击设备上的调试,签名工具再次对主.cod文件进行签名,然后应用程序在设备上启动。

但是,我从CodeSigningKey.get(..) 获得的密钥始终是null

我做错了什么?

解决方案

在迈克尔的提示下,我能够解决这个问题。

首先,我确实需要CodeSigningKey.get(...) 中的对象实例。但是,您应该注意一件事:如果您的对象扩展了某些类和/或实现了某些接口,那么所有这些都必须使用相同的密钥进行签名才能工作。如果任何祖先类/接口未签名,您将获得null

如果您的层次结构足够深,这可能会成为问题。哪些类使用哪些密钥签名的信息存储在BlackBerry_App_Descriptor.xml 中,并在单击调试时复制到签名工具的参数中。命令行可能会过长,导致签名工具失败并在控制台中显示“无效参数”消息。

所以我专门为签名目的提取了一个类:

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. 使用签名授权工具创建密钥后,启动该应用程序中包含的 WebAdmin 实用程序。它使您可以创建密钥数据库并启动 WebSigner 服务。

  2. 成功启动 WebAdmin 后,单击菜单 Record->Add。您将看到一个窗口,您可以在其中创建 .csi 文件。配置:请求数 - 无限;到期日 - 从不;电子邮件通知 - 无;电子邮件 CSI 文件 - 没有。单击确定,您将看到一个带有生成 PIN 的对话框 - 将其保存以备将来使用。 .csi 文件生成并保存在 Signing Authority Tool 的 /data 文件夹中。

  3. 使用Eclipse->Window->Preferences->BlackBerry plugin->Signature Tool->Install new keys 安装 .csi 文件并使用步骤 2 中的 PIN 进行注册。

完成。从现在开始,使用 RIM 密钥签名时,您的 .cod 文件也会自动使用您的密钥进行签名。

【问题讨论】:

  • There is no way to create a non-encrypted database and restrict its usage to only one application. This is because there are other ways (using file I/O operations) to read a plain-text database file from any application.blackberry.com/developers/docs/6.0.0api/net/rim/device/api/…
  • 我没有按照您如何获得代码签名密钥。 blackberry.com/developers/docs/6.0.0api/net/rim/device/api/… 就这么简单创建一个单一用途的类作为签名?你现在正在这样做吗:final DatabaseSecurityOptions secopt = new DatabaseSecurityOptions(SignatureClass.getKey())
  • @Tim 我已经对我的原始帖子添加了更新。
  • 您应该考虑将解决方案作为答案放在下面而不是问题中。很好的细节解决方案。

标签: sqlite blackberry code-signing


【解决方案1】:

我相信您需要应用程序中的对象实例,而不是类对象。在这种情况下,“this”应该可以工作。

【讨论】:

  • 感谢您的帮助,迈克尔!我已在原始帖子中添加了解决方案。
猜你喜欢
  • 2021-01-14
  • 2012-08-08
  • 1970-01-01
  • 2012-09-26
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多