android - 密码在一个大块中返回整个文件

标签 android encryption aes aes-gcm

我们在 Android 应用程序中使用 CipherCipherInputStream 来解密从服务器下载的文件。

出于某种原因,所有对 Cipher.update 的调用都会返回一个空 block ,而对 Cipher.doFinal 的调用会在一个 block 中返回整个文件。

这会导致大文件 OOM。

这是我们用来初始化密码的代码:

final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
SecretKeySpec key = new SecretKeySpec(keyData, "AES");
GCMParameterSpec nonce = new GCMParameterSpec(128, nonceData);
cipher.init(Cipher.DECRYPT_MODE, key, nonce);
  1. 为什么会这样?
  2. 这是可以在客户端解决的问题吗?

注意:我目前无权访问服务器代码。当我有的时候,我也会发布它。 注 2:这发生在 Android API 25.0.1

最佳答案

好问题!这是因为您使用的是 GCM 模式。在从服务器接收到所有数据之前,无法检查身份验证标记,因此 Java 会自动缓冲这些数据,对其进行检查,然后在检查完标记后为您提供最终数据。

GCM 模式非常适合相对较小的消息或文件,但不应使用 GCM 模式加密大文件。

您可能更喜欢将 CBC 模式与 HMAC 结合使用,将文件流式传输到磁盘,验证 HMAC,然后然后解密。它更迂回,但避免了您当前遇到的问题。

关于android - 密码在一个大块中返回整个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49970093/

相关文章:

Android 应用内计费响应列表为空

android - IBM 蓝调 : make POST request from Android and how to handle it in NodeJS

android - 如何更改长按图像时操作栏上的菜单?

c# - 在 C# 中加密文件名而不在结果字符串中包含不可用的字符

ios - 如何使用 AES-256 加密来加密整个文件?

c# - aes256 结果在 C# (Windows) 和 C++ (Ubuntu) 实现中不同

java - 从哪个版本的 JRE 支持 AES128-CTR

android - httpclient.在Android上执行速度非常慢

encryption - Java 应用程序和 C 应用程序与 OpenSSL 正确通信几分钟后发出 'bad record mac' 警报

c# - 在 C# 中使用 SEE SQlite 加密扩展