file permission - Permissão de pasta somente para a aplicação Android - Stack Overflow em Português
Tem como fazer com que os arquivos de uma pasta no sdcard tenha acesso somente pelo aplicativo? (algo como chown e chmod) Não necessariamente leitura, mas impedir remoção e edição por meio de outras aplicações (ex: explorer). Desconsidere aparelhos com root
editada 26/08/16 às 10:26
Que eu saiba não há como fazer isso. Podes é guardar teus arquivos dentro da tua aplicação Android, desde que não sejam muito grandes, e ai sim manténs o acesso somente pelo aplicativo. – Jorge B. 19/09/14 às 8:55
Posso dar uma pesquisada, mas acho o caminho do @JorgeB mais simples. – Wakim 19/09/14 às 13:38
Felipe, existe um "workaround" a ser feito que não posso dizer que funciona. Seria colocar todos os arquivos com extensão .nomedia, não sendo listado pelo MediaServer. Dê uma olhada nessa pergunta: stackoverflow.com/questions/7442895/…. – Wakim 19/09/14 às 17:05
@Wakim isso até pode servir pra esconder os arquivos do MediaServer, mas nada impede que um outro aplicativo acesse esses arquivos. Ou seja, se for uma simples questão cosmética, está ok, mas se for questão de segurança, o caminho apontado por @Jorge B. é mais garantido. P.S. Não entendo nada de desenvolvimento pra Android, mas as informações dessa página não seriam relevantes? Tipo, ela descreve como cada app no dispositivo tem seu próprio user id e group id, etc. – mgibsonbr 19/09/14 às 18:06
Sim @mgibsonbr, você tem razão sim. Eu também recomendo a solução do Fernando. Essas informações são relevantes sim, reforçando a segurança nas permissões do Internal Storage. – Wakim 19/09/14 às 18:12
Há uma solução viável, caso você queira guardar arquivos (possivelmente grandes) no seu sdcard e ainda torná-los acessíveis exclusivamente à sua aplicação: gerar uma chave de criptografia no seu aplicativo, salvá-la dentro da própria aplicação (como sugerido por Jorge B. nos comentários), e usá-la para cifrar/decifrar os arquivos que você quer proteger. Assim, você ao mesmo tempo se aproveita da abundância de espaço que o sdcard oferece, sem precisar gastar demais o espaço limitado que sua aplicação possui (uma chave de criptografia simétrica, como o AES, ocupa só 32 bytes).
Essa pergunta no SOen mostra meios de fazer isso. Se decidir segui-la, preste bastante atenção nos comentários do usuário owlstead - pode ser que as respostas citadas (inclusive a aceita) não sejam implementações seguras/confiáveis. Não tenho conhecimento suficiente pra opinar, mas fica aí o aviso... (ele parece saber bem do que está falando, ao contrário de mim, que sou semi-leigo no assunto)
Essa outra resposta, por outro lado, parece cuidar bem de todos os detalhes (derivação de chave correta, modo de operação correto, tratamento de encoding correto), de modo que pode ser um meio viável. Ela não é específica pro Android, entretanto, mas para o Java em geral - o que a princípio não deve ser um problema. Vou transcrevê-la aqui, adaptando e comentando:
/** Cria a chave para ser usada na cifragem/decifragem
*  @param senha A senha mestra. Secreta. Ficará salva junto ao aplicativo, não precisando
*               ser digitada pelo usuário (deve ser longa). Precisa de um meio de backup.
*  @param sal 8 bytes aleatórios. Não necessariamente secreto. Ficará salvo junto ao
*             aplicativo. Precisa constar no backup, junto com a senha.
*  @returns A chave secreta. Pode-se salvar ela, ou o par senha/sal, seu critério.
SecretKey obterChave(String senha, byte[] sal) {
KeySpec spec = new PBEKeySpec(senha, sal, 65536, 256);
/* Para cifrar um texto, usando a chave gerada anteriormente. */
byte[][] cifrarTexto(SecretKey chave, String texto) {
return cifrarDados(chave, texto.getBytes("UTF-8")); // Sempre o mesmo encoding
/* Para cifrar um arquivo binário, usando a chave gerada anteriormente. */
byte[][] cifrarDados(SecretKey chave, byte[] dados) {
cipher.init(Cipher.ENCRYPT_MODE, chave);
// O IV (Vetor de Inicialização) não é secreto, mas tem de ser diferente pra cada
// arquivo que for cifrado. Ele é gerado automaticamente pela biblioteca.
byte[] cifra = cipher.doFinal(dados);
return new byte[][] { cifra, iv }; // Ambos são necessários para decifrar! Salve-os.
/* Para decifrar um texto, usando a chave gerada anteriormente. */
String decifrarTexto(SecretKey chave, byte[][] cifraIV) {
return new String(decifrarDados(chave, cifraIV), "UTF-8"); // Sempre o mesmo encoding
/* Para decifrar um arquivo binário, usando a chave gerada anteriormente. */
byte[] decifrarDados(SecretKey chave, byte[][] cifraIV) {
byte[] iv = cifraIV[1];
byte[] cifra = cifraIV[0];
cipher.init(Cipher.DECRYPT_MODE, chave, new IvParameterSpec(iv));
return cipher.doFinal(cifra);
É importante oferecer ao usuário um meio de fazer backup da chave de criptografia, ou da senha usada para derivá-la (caso use alguma). Caso contrário, se houver algum problema com o aparelho e a aplicação e/ou seus dados se perderem, o usuário perde acesso a todos os seus arquivos.
Uma maneira de fazer isso é usando uma senha/chave mestra - forte - que o usuário só tem de digitar uma vez ao instalar o aplicativo e/ou fazer backup, e a partir daí ela fica salva na área restrita do aplicativo. Uma senha mais simples ou PIN é usada no dia-a-dia, para autenticação do usuário.
Pense num sdcard como o que ele é: um dispositivo de armazenamento externo. Sendo externo, é comum e previsto que ele será desacoplado de uma máquina e acoplado na outra - de modo que ele não pode depender de nenhuma proteção oferecida pelo sistema operacional. Ele precisa se proteger por si só.
(esse é um caso análogo a você pegar um sistema com Unix/Linux, tirar o HD e colocá-lo em outro computador com um SO diferente - não há garantias de que esse SO vai honrar as permissões de acesso. Ele pode deixar qualquer usuário acessar qualquer coisa...)
A solução default para esse caso é a criptografia. E ela vem com todos os "pitfalls" e "gotchas" que você poderia esperar - o principal deles a importância de se fazer backup da chave. Qual a melhor maneira de se fazer esse backup, aí não dá pra dizer de forma genérica: é um balanço entre a confidencialidade e a disponibilidade. Mas seja como for que você faça, o importante é que faça!
Disclaimer: não tenho experiência prática com desenvolvimento para Android, mas pelo meu entendimento dessa referência de segurança tudo me leva a crer que esse é um caminho viável. Para aparelhos sem root, é claro, como pedido na pergunta.
respondida 19/09/14 às 18:45
O android tem uma função que criptografa todos arquivos, evitando acesso indevido por outro aparelho caso o sdcard seja desconectado do mobile, mas esta função não é da API, é apenas uma função para usuários do Android protegerem seus arquivos (tem nas configurações), eu pesquisei sobre alguma maneira de esconder uma chave e achei o KeyChain developer.android.com/reference/android/security/KeyChain.html Mas sinceramente... Não entendi nada, e não encontro praticamente nada a respeito – felipe.rce 19/09/14 às 23:59
Creio que a resposta seja essa mesmo, mas vou esperar um pouco para ver se alguém trás mas alguma ideia – felipe.rce 19/09/14 às 23:59
@felipe.rce O KeyChain é responsável por guardar chaves e certificados relativos à criptografia assímétrica. Se quiser saber um pouco mais sobre ela, veja essa minha resposta à pergunta "Como o HTTPS (SSL) funciona?". A menos que você tenha necessidades bastante específicas, você não precisa (nem deve) usar o KeyChain diretamente. Nesse caso, estou falando de criptografia simétrica - onde a mesma chave é usada pra cifrar/decifrar. Desconheço o que já tem pronto nesse sentido, e o que você tem de fazer você mesmo. – mgibsonbr 20/09/14 às 13:06
A propósito, repito que não tenho experiência com Android, mas pelo pouco que li sobre "criptografar todos os arquivos do sdcard" isso existe mesmo, mas não encontrei nenhuma informação de como fazer backup dessa chave de criptografia (somente li que "se você usar esse mesmo sdcard em outro aparelho ele não será reconhecido"). E, como você mesmo apontou, é uma função do aparelho como um todo, não de aplicativos específicos. Por essas razões, não me parece aplicável ao seu caso. – mgibsonbr 20/09/14 às 13:09
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag android file-permission ou faça sua própria pergunta.