gpt4 book ai didi

android - 保护移动设备中的媒体文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:23:11 25 4
gpt4 key购买 nike

我正在考虑为 Android 开发鸟类目录。它将包含许多图片和音频文件。所有这些文件均来自拥有版权的第三方公司。

我的应用程序应(尽可能)确保这些媒体文件不可访问、复制或操纵。

我可以遵循哪些策略?在文件系统中加密文件并在显示或播放它们之前在内存中解密?将它们作为 CLOB 保存到 SQL Lite 中?这个 SQL Lite 是否可以从其他应用程序访问,或者它是否对其他应用程序隐藏?还有其他想法吗?我没有在网上找到太多关于这个“问题”的信息。

提前致谢

化学。

最佳答案

我建议将这些文件保存到 SD 卡,而不是你的 Activity 的私有(private)文件,因为图像/音频文件通常非常大(我看到 in this discussion 你计划处理 400 MB,这是同一个应用程序?)。所以加密应该没问题,而且比 SQLite 更直接。

下面的类允许将字节加密为二进制文件:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


public class AESEncrypter {
public static void encryptToBinaryFile(String password, byte[] bytes, File file) throws EncrypterException {
try {
final byte[] rawKey = getRawKey(password.getBytes());
final FileOutputStream ostream = new FileOutputStream(file, false);

ostream.write(encrypt(rawKey, bytes));
ostream.flush();
ostream.close();

} catch (IOException e) {
throw new EncrypterException(e);
}
}

public static byte[] decryptFromBinaryFile(String password, File file) throws EncrypterException {
try {
final byte[] rawKey = getRawKey(password.getBytes());
final FileInputStream istream = new FileInputStream(file);
final byte[] buffer = new byte[(int)file.length()];

istream.read(buffer);

return decrypt(rawKey, buffer);

} catch (IOException e) {
throw new EncrypterException(e);
}
}

private static byte[] getRawKey(byte[] seed) throws EncrypterException {
try {
final KeyGenerator kgen = KeyGenerator.getInstance("AES");
final SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");

sr.setSeed(seed);
kgen.init(128, sr); // 192 and 256 bits may not be available

final SecretKey skey = kgen.generateKey();

return skey.getEncoded();

} catch (Exception e) {
throw new EncrypterException(e);
}
}

private static byte[] encrypt(byte[] raw, byte[] clear) throws EncrypterException {
try {
final SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
final Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

return cipher.doFinal(clear);

} catch (Exception e) {
throw new EncrypterException(e);
}
}

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws EncrypterException {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
try {
final Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);

return cipher.doFinal(encrypted);

} catch (Exception e) {
throw new EncrypterException(e);
}
}

您还需要这个异常类:

public class EncrypterException extends Exception {
public EncrypterException ( ) { super( ); }
public EncrypterException (String str ) { super(str); }
public EncrypterException (Throwable e) { super(e); }
}

然后,您只需使用以下内容生成加密文件:

encryptToBinaryFile("password", bytesToSaveEncrypted, encryptedFileToSaveTo);

在您的应用中,您可以通过以下方式阅读它们:

byte [] clearData = decryptFromBinaryFiles("password", encryptedFileToReadFrom);

要使用硬编码密码,可以通过挖掘混淆代码并查找字符串来破解。我不知道在您的情况下这是否足够安全?

如果没有,您可以将密码存储在 Activity 的私有(private)首选项中,或者使用诸如 this.class.getDeclaredMethods()[n].getName() 之类的技巧作为密码。这个比较难找。

关于性能,您必须知道加密/解密可能需要很长时间。这需要一些测试。

[EDIT: 04-25-2014] 我的回答有一个很大的错误。此实现正在播种 SecureRandom,这是不好的(有些人会说是“邪恶”)。

有一种简单的方法可以避免这个问题。有详细说明here在 Android 开发者博客中。对此感到抱歉。

关于android - 保护移动设备中的媒体文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6676574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com