【发布时间】:2020-02-20 01:31:29
【问题描述】:
我正在加密在蓝牙服务中的 android 应用程序上创建的文件。稍后在另一堂课中,我想解密此文件并将其上传到服务器。
对于加密,我使用的是 AndroidX androidx.security:security-crypto:1.0.0-alpha02 库,它是 Tink 的包装器。我已阅读所有可以找到的有关 EncryptedFile、EncryptedFile.Builder 等的开发人员文档和教程。
我将文件加密如下:
String keySetAlias = "BilboBaggins";
String keySetPref = "Hobbits";
EncryptedFile m_StudyChannelEncryptedFile = new EncryptedFile.Builder(
filePath,
getApplicationContext(),
masterKeyAlias,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB).setKeysetAlias(keySetAlias).setKeysetPrefName(keySetPref).build();
m_output = m_StudyChannelEncryptedFile.openFileOutput();
从这里我可以像使用普通 FileOutputStream 一样写入文件,通过查看写入手机存储中的数据,我可以确认它是加密的。
在上传之前,我尝试在另一个类中做同样的事情然后解密它。
String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
String keySetAlias = "BilboBaggins";
String keySetPref = "Hobbits";
EncryptedFile encryptedFile = new EncryptedFile.Builder(
filePath,
getApplicationContext(),
masterKeyAlias,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB).setKeysetAlias(keySetAlias).setKeysetPrefName(keySetPref).build();
// Read channel data file
FileInputStream fChannel = encryptedFile.openFileInput();
m_Dat1Size = fChannel.available();
从这里的问题是我得到的文件的可用大小为零 - 就像它不存在一样。我可以确认写入的原始数据没有被覆盖,因为手机存储上的文件仍然有加密数据。
我相信,通过为它提供位置 keySetAlias、keySetPref,EncryptedFile 构建器应该能够初始化一个具有正确密钥的 EncryptedFile 实例。
我将不胜感激任何帮助或见解!
谢谢, 迈克尔
【问题讨论】:
-
你试过读它吗?
available只显示直接可用的数据。只是好奇读取是否会返回 -1 或实际数据。 -
这是一个了不起的建议 - 从文件中读取工作正常。在此之前,我使用 .available() 作为处理文件大小的一些逻辑的一部分,但我想如果有一层加密,它的行为可能会有所不同......谢谢你的建议!
标签: android file encryption androidx tink