Protegendo arquivo .dat

Pessoal estou em fase final de um projeto, e está me faltando só mais uma coisinha:
Meu projeto após ser aberto pela primeira vez, cria uma arquivo .dat que é usado pra guardar objetos serializados, cujos objetos farão parte do funcionamento do sistema, porém, eu estava vendo este arquivo e ele pode ser alterado facilmente, podendo causar um estrago no meu sistema. A pergunta é: como posso proteger este arquivo, impedindo que o usuário não tenha acesso ao mesmo?

Poderia oculta-lo :!: :?:

:thumbup:

Como eu posso fazer isto InicianteJavaHenrique, voce pode me dar um exemplo por favor

Proteger em Java…Hm…

Uma maneira tosca, e pouco efetiva de fazer isso é atribuir Oculto, Somente leitura e Arquivo de Sistema…

Pergunta: O Sistema é para alguma plataforma especifica ?

Se for para Windows, você chama o cmd e faz isso em uma linha…

Agora se for p/ Linux, ou se for para rodar multiplataforma […] =/

Eu estava testando algo vê se isso aqui funciona:

File file = new File("C:\\new.dat"); file.isHidden(); file.setReadOnly();

Ele atribui “Oculto e somente leitura” ao arquivo…(Eu não testei, mas é para funcionar)

Vale lembrar que se você for usar o arquivo (escrever) você tem que desfazer isso daí…

Se eu não me engando ficaria assim:

file.setWritable(true);

Se não você não vai conseguir escrever no arquivo !!!

Lembrando que esses métodos, apenas Ocultam o arquivo e o põe como somente leitura, qualquer usuário pode ir lá e modificar se ele tiver o mínimo de conhecimento do Prompt de comando, ou mesmo do SO.

Se você quiser proteger o arquivo, o ideal seria criptografia de 256bits (Mas eu não sei fazer isso em Java)

O que eu sei é que tem um comando no Windows, chamado “CACLS”, Ele muda as permissões dos arquivos, se você quiser, posso mostrar como usá-lo.

Demorei demais para postar ahshashsahsahsahas

Avelino , o que eu to querendo fazer eu acho que se chamar persistir dados nao é isso? Se for como posso fazer isto e salvar o arquivo de possiveis alterações? Mesmo o arquivo sendo criptografado, não corre o risco de o usuário inserir um ou uns caracteres ou apagá-los tb

Você pode criptografar seu arquivo. Veja a API de criptografia do Java.

Outra forma um pouco tosca de criptografia seria usar um XOR em todos os bits do arquivo com algum valor.
Se quiser um pouco mais de segurança, você pode somar uma constante a cada valor lido.
Ou então, inicializar o Random com uma semente conhecida, passar o xor usando o nextInt() a cada byte.

Uma outra opção seria usar a classe ZipFile para compactar seu arquivo.
Claro que alguém pode renomear de .dat para zip, mas já torna as coisas um pouco mais difíceis.

Por isso, o ideal é essa alternativa ser complementar a de cima.

Bem, para que o usuário não edite o arquivo, daria para usar o CACLS (No Windows):

Parta bloquear as permissões de arquivos:

cacls c:\arquivo.txt /p Todos:N

Isso faz com que o usuário, não tenha nenhuma permissão do arquivo, isso é, ele não pode renomear, escrever, excluir, copiar ou mover o arquivo.

Para desbloquear use:

cacls c:\arquivo.txt /g Todos:F


Peço que tenha muito cuidado com isso, se você bloquear a unidade c:\ vai ter sérios problemas !!!

Só tem um pequeno probleminha…
Esse comando pede confirmação, e vai ser preciso que se aperte S e depois um ENTER…

Não tem como fazer isso via DOS, tem como fazer em Java, através da Classe robot, gerando caracteres…mas isso seria uma SUPER-GAMBIARRA e portanto, não recomendo.

Porque se for um usuário expert, até mesmo o comando CACLS, não resolve ‘-’

Além de que sua aplicação só rodaria no Windows e java é multiplataforma, então, não gosto de quando a aplicação fica limitada a apenas um SO.

Eu testei assim:

Runtime.getRuntime().exec("cmd /c cacls 'C:\\arquivo.txt' /p Todos:N");

E não funcionou =/

Mas eu faria o seguinte:

Colocaria os arquivos que você quer proteger, lá no System32 ou junto com os arquivos do SO, por exemplo, ou em um outro lugar de difícil acesso, depois oculte-os, e coloque com somente leitura, isso basta para que o usuário não fique mexendo, depois, sempre que você escrever no arquivo use o :

file.setWritable(true); e lembre-se sempre de atribuir somente leitura, quando acabar…

Se você pegar o process que o Runtime.exec() retorna, pode simplesmente escrever a palavra “S” no InputStream do processo.

Mas ainda acho mais simples usar criptografia. Tem uma API pronta para isso e a aplicação continuará multiplataforma.

[quote=ViniGodoy]Se você pegar o process que o Runtime.exec() retorna, pode simplesmente escrever a palavra “S” no InputStream do processo.

Mas ainda acho mais simples usar criptografia. Tem uma API pronta para isso e a aplicação continuará multiplataforma.[/quote]

Como ficaria p/ escrever o “S” ??

e como daria para fazer isso ViniGodoy ??

Eu gostaria de aprender a criptografar arquivos em Java… ^^

Vinni, mas mesmo eu criptografando o arquivo, não corre o risco do usuário abri-lo e inserir ou excluir algum caracter?
Tentei usar este codigo:

file.isHidden(); file.setReadOnly();
mas em uma parte do programa ele manda um IOException

só mais uma coisa, o conteúdo do arquivo .dat sao objetos serializados. Por ser serializados, já não torna esse arquivo como uma criptografia, pois ao abri-lo usando o bloco de notas é impossivel entender o que está escrito

Use então:

//Para Ocultar, colocar somente leitura, e colocar como arquivo de sistema: Runtime.getRuntime().exec("cmd /c attrib +h +s +r C:/new.dat); //Para desocultar, e tirar os atributos somente leitura e de sistema: Runtime.getRuntime().exec("cmd /c attrib -h -s -r C:/new.dat);

Isso só funciona no Windows

[quote=ViniGodoy]Se você pegar o process que o Runtime.exec() retorna, pode simplesmente escrever a palavra “S” no InputStream do processo.

Mas ainda acho mais simples usar criptografia. Tem uma API pronta para isso e a aplicação continuará multiplataforma.[/quote]

Sou novo no fórum, não sabia que o site tinha artigos…

vlw pela dica, e desculpe qualquer coisa ViniGodoy.

Janfrancisco, como criptografar arquivos:
http://www.guj.com.br/articles/32

Fica ilegível no bloco de notas, mas não tanto num editor hexadecimal. Com a criptografia, fica totalmente ilegível.