保护SQLite数据库

时间:2011-08-30 20:38:01

标签: sqlite blackberry code-signing

在我的应用中,我有一个数据库,必须使用密钥保护该设备上的其他应用才能访问它。

问题是我无法在运行时获取签名密钥:无论我做什么,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,并将其放在{project_root}/keys/TEST.key的Eclipse项目中。

另外,我在Eclipse中点击了TEST.key,并选择了AbstractDB类与之签名。

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

我按如下方式运行:

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

  2. 使用签名授权工具我使用TEST.key

  3. 在步骤1中签署我的.cod文件
  4. 我再次单击设备上的调试,签名工具再次签署主.cod文件,然后应用程序在设备上启动。

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

    2. 成功启动WebAdmin后,点击菜单Record->Add。您将获得一个窗口,您可以在其中创建.csi文件。配置:请求数 - 无限;到期日 - 永远不会;电子邮件通知 - 无;电子邮件CSI文件 - 没有。单击确定,您将看到一个包含生成的PIN的对话框 - 保存以备将来使用。生成.csi文件并将其保存在签名授权工具的/ data文件夹中。

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

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

1 个答案:

答案 0 :(得分:2)

我相信您需要来自应用的对象实例,而不是类对象。在这种情况下,“这个”应该有效。