简体   繁体   English

如何限制对cordova android内部存储中的应用程序文件的访问?

[英]How to restrict access to app files in internal storage in cordova android?

Is it possible to prevent data in app's folder in internal storage from being accessed by a malicious user who gains physical access to the device and roots the device?是否可以防止内部存储中应用程序文件夹中的数据被获得设备物理访问权限并根设备的恶意用户访问? For eg: I have set android:debuggable - false in android manifest and even disabled allowBackup to false.例如:我在 android manifest 中设置了android:debuggable - false,甚至禁用了allowBackup为 false。 But if someone steals the device and roots it, they would be able to take the files from internal storage.但是如果有人窃取了设备并根植了它,他们将能够从内部存储中获取文件。 Is it possible to prevent it?有没有可能阻止它? Thanks in advance and any help would be appreciated.提前致谢,任何帮助将不胜感激。

My class is Crypter.java , copy this code into them我的班级是Crypter.java ,把这段代码复制进去

import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * Created by Alessandro Giordano on 23/02/2018.
 *
 * This class encrypt e decript bytes array, you can generate or replicate your credencals (public & private key)
 * or generate them. To decrypt you need the same credentials generated by the same KeyPair.
 */
public class Crypter {

//KEY FACTORY
public final String KEYFACTORY_RSA = "RSA";
public final String KEYFACTORY_DH = "DH";
public final String KEYFACTORY_DSA = "DSA";
public final String KEYFACTORY_EC = "EC";
public final String KEYFACTORY_X509 = "X.509";


//AES
public final String CHIPERINSTANCE_AES_CBC_ISO10126PADDING = "AES/CBC/ISO10126Padding";
public final String CHIPERINSTANCE_AES_CBC_NOPADDING = "AES/CBC/NoPadding";
public final String CHIPERINSTANCE_AES_CBC_PKCS5PADDING = "AES/CBC/PKCS5Padding";

public final String CHIPERINSTANCE_AES_CBF_ISO10126PADDING = "AES/CBF/ISO10126Padding";
public final String CHIPERINSTANCE_AES_CBF_NOPADDING = "AES/CBF/NoPadding";
public final String CHIPERINSTANCE_AES_CBF_PKCS5PADDING = "AES/CBF/PKCS5Padding";

public final String CHIPERINSTANCE_AES_CTR_ISO10126PADDING = "AES/CTR/ISO10126Padding";
public final String CHIPERINSTANCE_AES_CTR_NOPADDING = "AES/CTR/NoPadding";
public final String CHIPERINSTANCE_AES_CTR_PKCS5PADDING = "AES/CTR/PKCS5Padding";

public final String CHIPERINSTANCE_AES_CTS_ISO10126PADDING = "AES/CTS/ISO10126Padding";
public final String CHIPERINSTANCE_AES_CTS_NOPADDING = "AES/CTS/NoPadding";
public final String CHIPERINSTANCE_AES_CTS_PKCS5PADDING = "AES/CTS/PKCS5Padding";

public final String CHIPERINSTANCE_AES_ECB_ISO10126PADDING = "AES/ECB/ISO10126Padding";
public final String CHIPERINSTANCE_AES_ECB_NOPADDING = "AES/ECB/NoPadding";
public final String CHIPERINSTANCE_AES_ECB_PKCS5PADDING = "AES/ECB/PKCS5Padding";

public final String CHIPERINSTANCE_AES_OFB_ISO10126PADDING = "AES/OFB/ISO10126Padding";
public final String CHIPERINSTANCE_AES_OFB_NOPADDING = "AES/OFB/NoPadding";
public final String CHIPERINSTANCE_AES_OFB_PKCS5PADDING = "AES/OFB/PKCS5Padding";

public final String CHIPERINSTANCE_AES_GCM_NOPADDING = "AES/GCM/NOPADDING";


//AES-128
public final String CHIPERINSTANCE_AES128_CBC_NOPADDING = "AES_128/CBC/NoPadding";
public final String CHIPERINSTANCE_AES128_CBC_PKCS5PADDING = "AES_128/CBC/PKCS5Padding";

public final String CHIPERINSTANCE_AES128_ECB_NOPADDING = "AES_128/ECB/NoPadding";
public final String CHIPERINSTANCE_AES128_ECB_PKCS5PADDING = "AES_128/ECB/PKCS5Padding";

public final String CHIPERINSTANCE_AES128_GCM_NOPADDING = "AES_128/GCM/NoPadding";


//AES-256
public final String CHIPERINSTANCE_AES256_CBC_NOPADDING = "AES_256/CBC/NoPadding";
public final String CHIPERINSTANCE_AES256_CBC_PKCS5PADDING = "AES_256/CBC/PKCS5Padding";

public final String CHIPERINSTANCE_AES256_ECB_NOPADDING = "AES_256/ECB/NoPadding";
public final String CHIPERINSTANCE_AES256_ECB_PKCS5PADDING = "AES_256/ECB/PKCS5Padding";

public final String CHIPERINSTANCE_AES256_GCM_NOPADDING = "AES_256/GCM/NoPadding";


//ARC4
public final String CHIPERINSTANCE_ARC4_ECB_NOPADDING = "ARC4/ECB/NoPadding";


//BLOWFISH
public final String CHIPERINSTANCE_BLOWFISH_CBC_ISO10126PADDING =    "BLOWFISH/CBC/ISO10126Padding";
public final String CHIPERINSTANCE_BLOWFISH_CBC_NOPADDING =          "BLOWFISH/CBC/NoPadding";
public final String CHIPERINSTANCE_BLOWFISH_CBC_PKCS5PADDING =       "BLOWFISH/CBC/PKCS5Padding";

public final String CHIPERINSTANCE_BLOWFISH_CBF_ISO10126PADDING =    "BLOWFISH/CBF/ISO10126Padding";
public final String CHIPERINSTANCE_BLOWFISH_CBF_NOPADDING =          "BLOWFISH/CBF/NoPadding";
public final String CHIPERINSTANCE_BLOWFISH_CBF_PKCS5PADDING =       "BLOWFISH/CBF/PKCS5Padding";

public final String CHIPERINSTANCE_BLOWFISH_CTR_ISO10126PADDING =    "BLOWFISH/CTR/ISO10126Padding";
public final String CHIPERINSTANCE_BLOWFISH_CTR_NOPADDING =          "BLOWFISH/CTR/NoPadding";
public final String CHIPERINSTANCE_BLOWFISH_CTR_PKCS5PADDING =       "BLOWFISH/CTR/PKCS5Padding";

public final String CHIPERINSTANCE_BLOWFISH_CTS_ISO10126PADDING =    "BLOWFISH/CTS/ISO10126Padding";
public final String CHIPERINSTANCE_BLOWFISH_CTS_NOPADDING =          "BLOWFISH/CTS/NoPadding";
public final String CHIPERINSTANCE_BLOWFISH_CTS_PKCS5PADDING =       "BLOWFISH/CTS/PKCS5Padding";

public final String CHIPERINSTANCE_BLOWFISH_ECB_ISO10126PADDING =    "BLOWFISH/ECB/ISO10126Padding";
public final String CHIPERINSTANCE_BLOWFISH_ECB_NOPADDING =          "BLOWFISH/ECB/NoPadding";
public final String CHIPERINSTANCE_BLOWFISH_ECB_PKCS5PADDING =       "BLOWFISH/ECB/PKCS5Padding";

public final String CHIPERINSTANCE_BLOWFISH_OFB_ISO10126PADDING =    "BLOWFISH/OFB/ISO10126Padding";
public final String CHIPERINSTANCE_BLOWFISH_OFB_NOPADDING =          "BLOWFISH/OFB/NoPadding";
public final String CHIPERINSTANCE_BLOWFISH_OFB_PKCS5PADDING =       "BLOWFISH/OFB/PKCS5Padding";


//DES
public final String CHIPERINSTANCE_DES_CBC_ISO10126PADDING =    "DES/CBC/ISO10126Padding";
public final String CHIPERINSTANCE_DES_CBC_NOPADDING =          "DES/CBC/NoPadding";
public final String CHIPERINSTANCE_DES_CBC_PKCS5PADDING =       "DES/CBC/PKCS5Padding";

public final String CHIPERINSTANCE_DES_CBF_ISO10126PADDING =    "DES/CBF/ISO10126Padding";
public final String CHIPERINSTANCE_DES_CBF_NOPADDING =          "DES/CBF/NoPadding";
public final String CHIPERINSTANCE_DES_CBF_PKCS5PADDING =       "DES/CBF/PKCS5Padding";

public final String CHIPERINSTANCE_DES_CTR_ISO10126PADDING =    "DES/CTR/ISO10126Padding";
public final String CHIPERINSTANCE_DES_CTR_NOPADDING =          "DES/CTR/NoPadding";
public final String CHIPERINSTANCE_DES_CTR_PKCS5PADDING =       "DES/CTR/PKCS5Padding";

public final String CHIPERINSTANCE_DES_CTS_ISO10126PADDING =    "DES/CTS/ISO10126Padding";
public final String CHIPERINSTANCE_DES_CTS_NOPADDING =          "DES/CTS/NoPadding";
public final String CHIPERINSTANCE_DES_CTS_PKCS5PADDING =       "DES/CTS/PKCS5Padding";

public final String CHIPERINSTANCE_DES_ECB_ISO10126PADDING =    "DES/ECB/ISO10126Padding";
public final String CHIPERINSTANCE_DES_ECB_NOPADDING =          "DES/ECB/NoPadding";
public final String CHIPERINSTANCE_DES_ECB_PKCS5PADDING =       "DES/ECB/PKCS5Padding";

public final String CHIPERINSTANCE_DES_OFB_ISO10126PADDING =    "DES/OFB/ISO10126Padding";
public final String CHIPERINSTANCE_DES_OFB_NOPADDING =          "DES/OFB/NoPadding";
public final String CHIPERINSTANCE_DES_OFB_PKCS5PADDING =       "DES/OFB/PKCS5Padding";


//DESEDE
public final String CHIPERINSTANCE_DESede_CBC_ISO10126PADDING =    "DESede/CBC/ISO10126Padding";
public final String CHIPERINSTANCE_DESede_CBC_NOPADDING =          "DESede/CBC/NoPadding";
public final String CHIPERINSTANCE_DESede_CBC_PKCS5PADDING =       "DESede/CBC/PKCS5Padding";

public final String CHIPERINSTANCE_DESede_CBF_ISO10126PADDING =    "DESede/CBF/ISO10126Padding";
public final String CHIPERINSTANCE_DESede_CBF_NOPADDING =          "DESede/CBF/NoPadding";
public final String CHIPERINSTANCE_DESede_CBF_PKCS5PADDING =       "DESede/CBF/PKCS5Padding";

public final String CHIPERINSTANCE_DESede_CTR_ISO10126PADDING =    "DESede/CTR/ISO10126Padding";
public final String CHIPERINSTANCE_DESede_CTR_NOPADDING =          "DESede/CTR/NoPadding";
public final String CHIPERINSTANCE_DESede_CTR_PKCS5PADDING =       "DESede/CTR/PKCS5Padding";

public final String CHIPERINSTANCE_DESede_CTS_ISO10126PADDING =    "DESede/CTS/ISO10126Padding";
public final String CHIPERINSTANCE_DESede_CTS_NOPADDING =          "DESede/CTS/NoPadding";
public final String CHIPERINSTANCE_DESede_CTS_PKCS5PADDING =       "DESede/CTS/PKCS5Padding";

public final String CHIPERINSTANCE_DESede_ECB_ISO10126PADDING =    "DESede/ECB/ISO10126Padding";
public final String CHIPERINSTANCE_DESede_ECB_NOPADDING =          "DESede/ECB/NoPadding";
public final String CHIPERINSTANCE_DESede_ECB_PKCS5PADDING =       "DESede/ECB/PKCS5Padding";

public final String CHIPERINSTANCE_DESede_OFB_ISO10126PADDING =    "DESede/OFB/ISO10126Padding";
public final String CHIPERINSTANCE_DESede_OFB_NOPADDING =          "DESede/OFB/NoPadding";
public final String CHIPERINSTANCE_DESede_OFB_PKCS5PADDING =       "DESede/OFB/PKCS5Padding";


//RSA
public final String CHIPERINSTANCE_RSA_ECB_NOPADDING =             "RSA/ECB/NoPadding";
public final String CHIPERINSTANCE_RSA_ECB_OAEPPADDING =           "RSA/ECB/OAEPPadding";
public final String CHIPERINSTANCE_RSA_ECB_PKCS1PADDING =          "RSA/ECB/PKCS1Padding";
public final String CHIPERINSTANCE_RSA_ECB_OAEPSHA1MGF1Padding =    "RSA/ECB/OAEPwithSHA-1andMGF1Padding";
public final String CHIPERINSTANCE_RSA_ECB_OAEPSHA256MGF1Padding =    "RSA/ECB/OAEPwithSHA-256andMGF1Padding";
public final String CHIPERINSTANCE_RSA_ECB_OAEPSHA224MGF1Padding =    "RSA/ECB/OAEPwithSHA-224andMGF1Padding";
public final String CHIPERINSTANCE_RSA_ECB_OAEPSHA384MGF1Padding =    "RSA/ECB/OAEPwithSHA-384andMGF1Padding";
public final String CHIPERINSTANCE_RSA_ECB_OAEPSHA512MGF1Padding =    "RSA/ECB/OAEPwithSHA-512andMGF1Padding";

public final String CHIPERINSTANCE_RSA_NONE_NOPADDING =                  "RSA/NONE/NoPadding";
public final String CHIPERINSTANCE_RSA_NONE_OAEPPADDING =                "RSA/NONE/OAEPPadding";
public final String CHIPERINSTANCE_RSA_NONE_PKCS1PADDING =               "RSA/NONE/PKCS1Padding";
public final String CHIPERINSTANCE_RSA_NONE_OAEPSHA1MGF1Padding =        "RSA/NONE/OAEPwithSHA-1andMGF1Padding";
public final String CHIPERINSTANCE_RSA_NONE_OAEPSHA256MGF1Padding =      "RSA/NONE/OAEPwithSHA-256andMGF1Padding";
public final String CHIPERINSTANCE_RSA_NONE_OAEPSHA224MGF1Padding =      "RSA/NONE/OAEPwithSHA-224andMGF1Padding";
public final String CHIPERINSTANCE_RSA_NONE_OAEPSHA384MGF1Padding =      "RSA/NONE/OAEPwithSHA-384andMGF1Padding";
public final String CHIPERINSTANCE_RSA_NONE_OAEPSHA512MGF1Padding =      "RSA/NONE/OAEPwithSHA-512andMGF1Padding";

public KeyPair keyPair;
public byte[] publicKey;
public byte[] privateKey;

/**
 *
 * @param publicKey byte[]
 * @param privateKey byte[]
 */
public Crypter(byte[] publicKey, byte[] privateKey, KeyPair keyPair) {
    this.keyPair = keyPair;
    this.publicKey = publicKey;
    this.privateKey = privateKey;
}

/**
 *
 * @param publicKey byte[]
 * @param privateKey byte[]
 */
public Crypter(byte[] publicKey, byte[] privateKey) {
    this.keyPair = null;
    this.publicKey = publicKey;
    this.privateKey = privateKey;
}

public Crypter(){
    this.keyPair = generateKeyPair();
    assert keyPair != null;
    this.publicKey = generatePublicKey();
    this.privateKey = generatePrivateKey();
}

/**
 *
 * @param inpBytes byte[]
 * @param keyFactor String
 * @param chiperInstance Stirng
 * @return byte[]
 */
public byte[] encrypt(byte[] inpBytes, String keyFactor, String chiperInstance){
    try {
        KeyFactory kf = KeyFactory.getInstance(keyFactor); // KEYFACTOR_RSA
        //PrivateKey privateKey = kf.generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
        PublicKey pbk = kf.generatePublic(new X509EncodedKeySpec(this.publicKey));
        String xForm = chiperInstance; //CHIPERINSTANCE_RSA_ECB_PKCS1PADDING
        Cipher cipher = Cipher.getInstance(xForm);
        cipher.init(Cipher.ENCRYPT_MODE, pbk);
        return cipher.doFinal(inpBytes);
    }catch (Exception e){
        e.printStackTrace();
        return null;
    }
}

/**
 *
 * @param inpBytes byte[]
 * @param keyFactor String
 * @param chiperInstance String
 * @return byte[]
 */
public byte[] decrypt(byte[] inpBytes, String keyFactor, String chiperInstance){

    try {
        KeyFactory kf = KeyFactory.getInstance(keyFactor); // or "EC" or whatever
        PrivateKey pvk = kf.generatePrivate(new PKCS8EncodedKeySpec(this.privateKey));
        String xForm = chiperInstance;
        Cipher cipher = Cipher.getInstance(xForm);
        cipher.init(Cipher.DECRYPT_MODE, pvk);

        return cipher.doFinal(inpBytes);
    }catch (Exception e){
        e.printStackTrace();
        return null;
    }
}

/**
 *
 * @return KeyPair
 */
private KeyPair generateKeyPair(){
    KeyPairGenerator kpg;
    KeyPair key;
    try {
        kpg = KeyPairGenerator.getInstance(KEYFACTORY_RSA);
        kpg.initialize(1000); // The size of the key
        key = kpg.generateKeyPair();

        return key;
    } catch (NoSuchAlgorithmException ex) {
        ex.printStackTrace();
    }
    return null;
}

/**
 *
 * @return byte[]
 */
private byte[] generatePublicKey(){
    PublicKey key = this.keyPair.getPublic();
    return key.getEncoded();
}

/**
 *
 * @return byte[]
 */
private byte[] generatePrivateKey(){
    PrivateKey key = this.keyPair.getPrivate();
    return key.getEncoded();
}
}

And than this is an example to use Crypter class:这是使用Crypter类的示例:

    //CRYPTER CLASS TEST

    Crypter crypter = new Crypter();

    byte[] encrypted = crypter.encrypt("Hey how are you".getBytes(), crypter.KEYFACTORY_RSA, crypter.CHIPERINSTANCE_RSA_ECB_PKCS1PADDING);

    byte[] base64enc = Base64.encodeBase64(encrypted);

    System.out.println(new String(base64enc));
    System.out.println("");

    FileWriterUtil.getOutputStramWriter("F://filecrypt.txt", base64enc);

    String readed = FileReaderUtil.getBuffederString("F://filecrypt.txt");

    System.out.println(readed);


    for (int i = 0; i<encrypted.length; i++){
        if(Byte.compare(encrypted[i], Base64.decodeBase64(readed.getBytes())[i]) != 0) {
            System.out.println(encrypted[i] + "--" + readed.getBytes()[i]);

        }
    }

    System.out.println(encrypted.length + "--" + Base64.decodeBase64(readed.getBytes()).length);

    Crypter decrpter = new Crypter(crypter.publicKey, crypter.privateKey);


    byte[] decrypted = decrpter.decrypt(Base64.decodeBase64(readed.getBytes()), crypter.KEYFACTORY_RSA, crypter.CHIPERINSTANCE_RSA_ECB_PKCS1PADDING);

    System.out.println(new String(decrypted));

Example first encrypts the string to byte[] and encode it in Base64 to write it to a .txt file, than does the reverse proccess to decrypt the encoded string示例首先将字符串加密为 byte[] 并在 Base64 中对其进行编码以将其写入 .txt 文件,然后进行解密编码字符串的反向过程

您无法阻止对路由设备的访问,但我建议您对文件进行加密

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM