如何在APK中保护解密密码和盐

时间:2014-11-07 15:57:32

标签: android encryption cryptography decompiling copy-protection

我正在创建一个使用Android手机更新固件的产品。 android应用程序自动下载固件的加密版本,对其进行解密,然后将其发送到设备启动加载程序。为了生成相同的密钥,我在代码中指定了密码和salt。我担心apk会被反编译,有人可以解密我们的固件。

有没有更好的方法来解密/加密文件或保护代码?

代码:

private byte[] DecryptFile(byte[] encryptedFileBuffer) {        

    final int iterationCount = 10;

    byte[] dataDecrypted = null;
    SecretKey secKey = null;
    try {
        byte[] salt = "salt1234".getBytes();
        String accessThingy = "Password";
        KeySpec keySpec = new PBEKeySpec(accessThingy.toCharArray(), salt, iterationCount);
        secKey = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
        AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);


        Cipher desCipher;
        // Create the cipher 
        desCipher = Cipher.getInstance(secKey.getAlgorithm());          
        desCipher.init(Cipher.DECRYPT_MODE, secKey,paramSpec);

        dataDecrypted = desCipher.doFinal(encrptedFileBuffer);

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }

    return dataDecrypted;

}

2 个答案:

答案 0 :(得分:1)

是和否。

,如果攻击者可以执行解密例程(以及为什么会这样做),那么固件会受到损害。避免这种情况的唯一方法是为设备上的密钥添加保护。您可以考虑OS /硬件支持,或者将密钥/密码存储在设备外部。但是,单个受损设备会泄漏固件。这是DRM的难题。

,因为您似乎使用PBKDF1,MD5和DES,其中没有一个特别安全。 MD5是该列表中破解最多的算法,但它最不可能实际成为问题。您应该使用PBKDF2,SHA-2和AES。尝试this answer,Java 8还增加了对SHA-2的PBKDF2的支持。或者您实际上可以使用完全随机密钥而不是使用基于密码的加密(PBE)。

您可能还需要考虑非对称原语(ECDSA / RSA)进行加密和代码签名。

答案 1 :(得分:0)

是否可以将解密移动到设备本身?这样,假设没有任何方法从设备读回程序(这也会导致问题)最终用户无法访问代码。