【问题标题】:How Do I Protect Decryption Password And Salt in APK如何保护APK中的解密密码和盐
【发布时间】:2015-01-04 11:23:27
【问题描述】:

我正在创建一个使用安卓手机更新固件的产品。 android 应用程序会自动下载固件的加密版本,对其进行解密,然后将其发送到设备引导加载程序。为了生成相同的密钥,我在代码中指定了密码和盐。我担心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;

}

【问题讨论】:

    标签: android encryption cryptography decompiling copy-protection


    【解决方案1】:

    是和不是。

    ,如果解密程序可以被攻击者执行(为什么不能执行),那么固件就会被破坏。避免这种情况的唯一方法是为设备上的密钥添加保护。您可以考虑操作系统/硬件对此的支持,或者例如将密钥/密码存储在设备之外。但是单个受感染的设备会泄漏固件。这是 DRM 难题。

    并且是的,因为您似乎使用 PBKDF1、MD5 和 DES,它们都不是特别安全。 MD5 是该列表中最坏的算法,但它是最不可能真正成为问题的算法。您应该改用 PBKDF2、SHA-2 和 AES。试试this answer,Java 8 还增加了对带有 SHA-2 的 PBKDF2 的支持。或者,您实际上可以使用完全随机的密钥,而不是使用基于密码的加密 (PBE)。

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

    【讨论】:

    • 这个答案有什么遗漏吗?请不要忘记跟进,如果答案对您有帮助,请采纳。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 2012-07-07
      • 2017-03-10
      • 2014-11-30
      • 2016-04-09
      相关资源
      最近更新 更多