加密填充块损坏异常排查:代码执行顺序是否需调整?
崩溃问题分析与代码顺序调整建议
问题背景
根据提供的崩溃报告和代码片段,崩溃由org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted引发,推测与代码执行顺序相关,现分析并给出调整建议。
崩溃堆栈信息
Codename One revisions: 7dd4e7d08b3442d90959477ee52a5ae8c4361b29 [EDT] 0:0:0,3 - Exception: java.io.IOException - org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted java.io.IOException at com_codename1_crypto_EncryptedStorage.createInputStream:70 at com_codename1_io_Storage.readObject:263 at com_codename1_io_Preferences.get:84 at com_codename1_io_Preferences.get:252 at com_fluency_fluencymobile_server_ServerImpl.__INIT__:49 at com_fluency_fluencymobile_server_Server.__CLINIT__:14 at com_fluency_fluencymobile_Main.init:51 at com_fluency_fluencymobile_MainStub.run:30 at com_codename1_ui_Display.processSerialCalls:1303 at com_codename1_ui_Display.mainEDTLoop:1097 at com_codename1_ui_RunnableWrapper.run:120 at com_codename1_impl_CodenameOneThread.run:176 at java_lang_Thread.runImpl:153
当前初始化代码
public void init(Object context) { Preferences.setPreferencesLocation("EncryptedPreferences"); Storage.getInstance().deleteStorageFile(Cookie.STORAGE_NAME); EncryptedStorage.install("hshdjimnj"); JSONParser.setUseLongs(true); Display.getInstance().setProperty("AppVersion", "2.1"); NetworkManager.getInstance().updateThreadCount(2); Util.register("Activity", Activity.class); Util.register("OfflineCommand", OfflineCommand.class); Util.register("Appointment", Appointment.class); theme = UIManager.initNamedTheme("/theme", "Theme"); Dialog.setDefaultBlurBackgroundRadius(10);
问题根源
从堆栈可以看出,崩溃发生在Server类的静态初始化块(__CLINIT__)中,此时ServerImpl的初始化代码调用了Preferences.get方法。但当前代码中,Preferences.setPreferencesLocation("EncryptedPreferences")先于EncryptedStorage.install("hshdjimnj")执行——这意味着当Preferences开始读取数据时,加密存储还未完成安装,导致读取加密存储内容时出现解密失败(pad block corrupted)。
另外,Server类的静态初始化被提前触发(在Main.init的第51行),此时加密存储尚未初始化,进一步加剧了这个问题。
调整建议
- 优先安装加密存储:将
EncryptedStorage.install移至所有Preferences相关操作(包括设置存储位置)之前,确保加密存储在Preferences使用前完全初始化。 - 延迟静态类初始化:检查
Server类的静态代码逻辑,避免在应用初始化早期就触发Preferences读取;如果无法避免,必须确保加密存储在Server类加载前完成安装。
调整后的代码示例:
public void init(Object context) { // 先安装加密存储,确保所有加密操作前完成初始化 EncryptedStorage.install("hshdjimnj"); // 再设置Preferences的存储位置 Preferences.setPreferencesLocation("EncryptedPreferences"); Storage.getInstance().deleteStorageFile(Cookie.STORAGE_NAME); JSONParser.setUseLongs(true); Display.getInstance().setProperty("AppVersion", "2.1"); NetworkManager.getInstance().updateThreadCount(2); Util.register("Activity", Activity.class); Util.register("OfflineCommand", OfflineCommand.class); Util.register("Appointment", Appointment.class); theme = UIManager.initNamedTheme("/theme", "Theme"); Dialog.setDefaultBlurBackgroundRadius(10);
内容的提问来源于stack exchange,提问作者user1678742
相关产品推荐
相关产品推荐

