保护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的警告:“未注册”和“请联系签名者并向签名机构注册.”) 但是,我从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服务. 完成.从现在开始,使用RIM密钥签名时,您的.cod也会自动使用您的密钥签名. 解决方法我相信你需要一个来自你的应用程序的对象实例,而不是一个类对象.在这种情况下,“这个”应该起作用.(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |