Android:解密并复制资产文件夹中的sqlite文件

时间:2017-06-22 09:51:57

标签: java android encryption aes 7zip

我有一个加密的sqlite db文件,我在安装和解密时将其复制到内存中。我这样做是为了保护我的数据库的安全功能。 我使用7zip程序使用以下设置加密sqlite文件 - 我只加密文件但不压缩文件:7zip print screen encrypting the sqlite file

请注意,我使用的是AES-256加密方法。

我将此文件复制到assets文件夹。

这是我用来复制和解密sqlite文件的类。

public class AssetDatabaseOpenHelper {

    private static final String DB_NAME = "dictionary.db";
    private static final String DB_NAME_ENCRYPTED = "dictionary.7z";

    private Context context;

    public AssetDatabaseOpenHelper(Context context) {
        this.context = context;
    }

    public SQLiteDatabase openDatabase() {
        File dbFile = context.getDatabasePath(DB_NAME);
        File dbFileEncrypted = context.getDatabasePath(DB_NAME_ENCRYPTED);

        if (!dbFile.exists()) {
            try {
                copyDatabase(dbFile);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return SQLiteDatabase.openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READWRITE);
    }

    private void copyDatabase(File dbFile) throws IOException, IOException, NoSuchAlgorithmException,
    NoSuchPaddingException, InvalidKeyException{

        Toast.makeText(context, "The language dictionary is getting copied to your local file. Please wait.\n This is done once when the app is ran for the first time.", Toast.LENGTH_LONG).show();

        InputStream is = context.getAssets().open(DB_NAME_ENCRYPTED);

        if (!dbFile.getParentFile().exists()) dbFile.getParentFile().mkdir();
        OutputStream os = new FileOutputStream(dbFile);

        // Length is 16 byte
        SecretKeySpec sks = new SecretKeySpec("mypassword".getBytes(),
                "AES_256");
        // Create cipher
        Cipher cipher = Cipher.getInstance("AES_256");

        cipher.init(Cipher.DECRYPT_MODE, sks);
        // Wrap the output stream
        CipherInputStream cis = new CipherInputStream(is, cipher);
        // Write bytes
        int b;
        byte[] d = new byte[8];
        while ((b = cis.read(d)) != -1) {
            os.write(d, 0, b);
        }
        os.flush();
        os.close();
        is.close();
        Toast.makeText(context, "The application is ready for the first use .", Toast.LENGTH_LONG).show();


    }
}

我感兴趣的主要方法是copyDatabase(...)。

我得到的错误是无法找到数据库中的表&#34;没有这样的表...&#34; - 我得出结论文件已创建但不正确。< / p>

你能发现过程中的错误吗? 问候。

0 个答案:

没有答案