如何在Android上覆盖EncryptedFile?

How to overwrite EncryptedFile on Android?

提问人:Ryan Pierce 提问时间:7/28/2020 最后编辑:Ryan Pierce 更新时间:9/15/2023 访问量:1565

问:

使用 Android 的 EncryptedFile (androidx.security:security-crypto:1.1.0-alpha01),我可以使用以下代码成功编写文件

File file = new File(context.getFilesDir() + File.separator + filename);
KeyGenParameterSpec keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC;
EncryptedFile encryptedFile = null;
try {
    String masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec);
    encryptedFile = new EncryptedFile.Builder(
            file,
            context,
            masterKeyAlias,
            EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
    ).build();
} catch (Exception exception) {
    // log error
}

// write file
try {
    BufferedWriter bufferedWriter = new BufferedWriter(
            new OutputStreamWriter(encryptedFile.openFileOutput()));
    bufferedWriter.write(string);
    bufferedWriter.close();
} catch (Exception exception) {
    // log error
}

但是,当尝试覆盖同一文件时,写入操作将失败,并引发以下内容

java.io.IOException: output file already exists, please use a new file

我发现这是 EncryptedFile 的显式检查openFileOutput()

if (mFile.exists()) {
    throw new IOException("output file already exists, please use a new file: "
            + mFile.getName());
}

为了解决这个问题,我能够通过删除文件(如果存在)来成功覆盖,然后再使用它来构建 EncryptedFile

File file = new File(context.getFilesDir() + File.separator + filename);
if (file.exists()) { file.delete(); }

... remaining code from top snippet above

这似乎是一个黑客,但我也不理解为 in 抛出异常的选择。有没有正确/更好的方法来覆盖?mFile.exists()openFileOutput()EncryptedFile

Android 文件 加密

评论

2赞 Henry 7/28/2020
首先删除文件对我来说似乎很好。
2赞 Rowan Gontier 4/8/2021
我遇到过一些情况,if (file.exists()) { file.delete(); } 不起作用,并且此异常:throw new IOException(“输出文件已存在,请使用新文件:” + mFile.getName());还是被抛了。有什么想法吗?

答: 暂无答案