保护SQLite数据库

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

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

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

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

我运行如下:

>在设备上开始调试 – 这将启动打包和签名.cod文件. (但是,在签名工具窗口中,我收到有关我的TEST.key的警告:“未注册”和“请联系签名者并向签名机构注册.”)
>使用签名授权工具我使用我的TEST.key签署在步骤1中获得的.cod文件
>我再次单击设备上的调试,然后签名工具再次签署主.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提供了“Not registered”错误.要解决此问题并一次性自动签署.cod,请执行以下步骤.

>使用签名授权工具创建密钥后,启动该应用程序中包含的WebAdmin实用程序.它允许您创建密钥数据库并启动WebSigner服务.
>成功启动WebAdmin后,单击菜单Record-> Add.您将获得一个窗口,您可以在其中创建.csi文件.配置:请求数 – 无限;到期日 – 永远不会;电子邮件通知 – 无;电子邮件CSI文件 – 没有.单击确定,您将看到一个包含生成的PIN的对话框 – 保存以备将来使用.生成.csi文件并将其保存在Signing Authority Tool的/ data文件夹中.
>使用Eclipse-> Window-> Preferences-> BlackBerry插件 – >签名工具 – >安装.csi文件安装新密钥并使用步骤2中的PIN进行注册.

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

最佳答案 我相信你需要一个来自你的应用程序的对象实例,而不是一个类对象.在这种情况下,“这个”应该起作用.

点赞