【发布时间】: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 类。
我在真实设备上运行我的应用程序,而不是在模拟器中。
我运行如下:
-
在设备上开始调试 - 这会启动 .cod 文件的打包和签名。 (但是,在签名工具窗口中,我收到有关我的 TEST.key 的警告:“未注册”和“请联系签名者并在签名机构注册。”)
李> 使用签名授权工具,我使用我的
TEST.key对在步骤 1 中获得的 .cod 文件进行签名我再次点击设备上的调试,签名工具再次对主.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 一次性自动签名,请执行以下步骤。
使用签名授权工具创建密钥后,启动该应用程序中包含的 WebAdmin 实用程序。它使您可以创建密钥数据库并启动 WebSigner 服务。
成功启动 WebAdmin 后,单击菜单
Record->Add。您将看到一个窗口,您可以在其中创建 .csi 文件。配置:请求数 - 无限;到期日 - 从不;电子邮件通知 - 无;电子邮件 CSI 文件 - 没有。单击确定,您将看到一个带有生成 PIN 的对话框 - 将其保存以备将来使用。 .csi 文件生成并保存在 Signing Authority Tool 的 /data 文件夹中。使用
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