如何在Android中加密和解密文件?

我想加密文件并将其存储在SD卡中。我想解密那个加密文件,并将其再次存储在SD卡中。我试图通过将文件作为文件流打开并对其进行加密来加密该文件,但它不起作用。我想知道怎么做

CipherOutputStreamcipheriputstreamCipherFileInputStream一起使用

我建议使用类似于Cipher.getInstance(“AES/CBC/PKCS5Padding”)的方法来创建Cipher类。CBC模式是安全的,不存在ECB模式对非随机明文的漏洞。它应该存在于任何通用加密库中,以确保高兼容性

如果您想用同一密钥加密多个文件,请不要忘记使用安全随机生成器生成的初始化向量(IV)。可以在密文的开头加上普通IV的前缀。它的大小总是正好是一个块(16字节)

如果要使用密码,请确保使用了良好的密钥派生机制(查找基于密码的加密或基于密码的密钥派生)。PBKDF2是最常用的基于密码的密钥派生方案,它出现在大多数Java运行时中,包括Android。请注意,SHA-1是一个有点过时的哈希函数,但在PBKDF2中应该可以,并且目前提供了最兼容的选项

在编码/解码字符串时,请始终指定字符编码,否则,当平台编码与前一种编码不同时,您将遇到麻烦。换句话说,不要使用String.getBytes(),而是使用String.getBytes(StandardCharsets.UTF_8)

为了使其更安全,请通过在密文和IV上添加安全校验和(MAC或HMAC)来添加加密完整性和真实性,最好使用不同的密钥。如果没有身份验证标签,密文可能会以无法检测到更改的方式进行更改

请注意,CipherInputStream可能不会报告BadPaddingException,这包括为经过身份验证的密码(如GCM)生成的BadPaddingException。这将使流对于此类经过身份验证的密码不兼容且不安全。

发表评论