我正在创建一个使用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;
}
答案 0 :(得分:1)
是和否。
否,如果攻击者可以执行解密例程(以及为什么会这样做),那么固件会受到损害。避免这种情况的唯一方法是为设备上的密钥添加保护。您可以考虑OS /硬件支持,或者将密钥/密码存储在设备外部。但是,单个受损设备会泄漏固件。这是DRM的难题。
而是,因为您似乎使用PBKDF1,MD5和DES,其中没有一个特别安全。 MD5是该列表中破解最多的算法,但它最不可能实际成为问题。您应该使用PBKDF2,SHA-2和AES。尝试this answer,Java 8还增加了对SHA-2的PBKDF2的支持。或者您实际上可以使用完全随机密钥而不是使用基于密码的加密(PBE)。
您可能还需要考虑非对称原语(ECDSA / RSA)进行加密和代码签名。
答案 1 :(得分:0)
是否可以将解密移动到设备本身?这样,假设没有任何方法从设备读回程序(这也会导致问题)最终用户无法访问代码。