【发布时间】:2014-05-04 22:25:01
【问题描述】:
我正在尝试为流 AES 加密创建一个小型库,我基于 Facebook Conceal 项目 (https://github.com/facebook/conceal) 开始了我的工作,只是更改了一些内容并改进了本机周围的包装器以支持带有填充的密码。
它正在工作,它可以毫无问题地解密文件,但是当我处理大型流时,我会遇到随机堆内存损坏,并且经过大量时间调试后,我无法找到错误。
这是我的代码:
https://gist.github.com/frisco82/9782725
我试图找到内存分配或空闲问题,但几乎没有 malloc 或空闲,jni 调用应该是安全的,openssl 也是如此(我自己编译了但隐藏提供的也失败了)
CheckJni 不会发出任何警告,虽然上下文处理有点开箱即用,但它似乎并没有损坏(实际上,Android conscrypt 似乎使用了类似的东西)。
此外,如果有人可以将我指向 Android 原生 AES 多步(多次更新调用)库,我将切换到该库并忘记这一点。
错误不时变化,但通常与他的相似:
03-26 10:33:02.065: A/dalvikvm(2475): @@@ ABORTING: DALVIK: HEAP MEMORY CORRUPTION IN mspace_malloc addr=0x0
03-26 10:33:02.065: A/libc(2475): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 2494 (AsyncTask #1)
03-26 10:33:02.205: I/DEBUG(933): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-26 10:33:02.205: I/DEBUG(933): Build fingerprint: 'generic_x86/google_sdk_x86/generic_x86:4.4.2/KK/999428:eng/test-keys'
03-26 10:33:02.205: I/DEBUG(933): Revision: '0'
03-26 10:33:02.205: I/DEBUG(933): pid: 2475, tid: 2494, name: AsyncTask #1 >>> com.proton <<<
03-26 10:33:02.205: I/DEBUG(933): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
完整的堆栈跟踪:
http://pastebin.com/f6mDuQEj
【问题讨论】:
-
崩溃转储的其余部分在哪里?您需要检查堆栈跟踪并与您的程序进行比较以了解故障。
-
添加了带有几条痕迹的馅饼,但由于这是内存损坏,因此在发现损坏时,strack 痕迹不会显示错误,这就是为什么这要复杂得多。
-
只是好奇,为什么隐藏不适合你?如果您在 github 上提出问题,我可能会提供帮助。
-
@user868459 好吧,我需要使用支持多种密钥长度的 AES CBC PKCS5,因为我们的 android 应用程序只是用于不同平台的几个应用程序之一,加密文件可以在它们之间共享。今天我将发布我的更改,因为最终解决了这个问题。
-
@frisco 我明白了。如果您能提交一份包含您的特定用例和解决方法的报告,将不胜感激。这将帮助我们决定 Conceal 可以提供什么样的支持来支持该案例:github.com/facebook/conceal/issues?state=open。
标签: android c encryption openssl java-native-interface