Criptografia

16 respostas
D

Pessoal é o seguinte eu tenho Metodo que uso nas linguagens que programo para criptografar strings, em delphi, php e java eu uso o mesmo metodo, quando salvo na base de dados blz, mas quando eu retorno o valor inserido na base de dados não vem como tá na base de dados em java:

o metodo é o seguinte:

public static String crpt(String wStri) {
         String Simbolos1,Simbolos2,reposta = "";
         int x = 0;
         int posicao = 0;
         int valor = 0;

         Simbolos1 = "ABCDEFGHIJLMNOPQRSTUVXZYWK ~!@#$%^&*()./:-abcdefghijlmnopqrstuvxzywk1234567890";
         Simbolos2 = "ÂÀ©Øû×?çêùÿ5Üø£úñѪº¿®¬¼ëèïÙýÄÅÉæÆôöò»./:-áâäàåíóÇüé¾¶§÷ÎÏ|+ÌÓ߸°¨·¹³²Õµþîì¡«½";

         for (int i = 1; i <= wStri.trim().length(); i++) {  
            if ( Simbolos1.indexOf(wStri.substring(i-1,i)) > 0 ) { 
              valor = Simbolos1.indexOf(wStri.substring(i-1,i)) ; 
              reposta = reposta + Simbolos2.substring(valor,valor + 1); 
            }
            else
            if ( Simbolos2.indexOf(wStri.substring(i-1,i)) > 0 ) { 
              valor = Simbolos2.indexOf(wStri.substring(i-1,i)) ; 
              reposta = reposta + Simbolos1.substring(valor,valor + 1); 
            }    
                
         }  
           return reposta; 
        }

seu eu usar dendo do java em string blz ele funciona, mas seu eu salvar em base de dados não retorna a mesma coisa:

System.out.println( crpt("123456") );
System.out.println( crpt("³²Õµþî") );

resposta:

³²Õµþî
123456

agora se eu colocar na base de dados o resultado será

123456
��յ��

mas se

16 Respostas

V

Seu problema não deve está ligado ao seu código mas sim com relação a codificação do teu banco de dados, procure ver se quando vc salva no banco de dados está em UTF-8, verifique também se a string que vc está enviando está em UTF-8

tipo para vc ter uma ideia codificação é o que “transforma” letras em números exemplo a letra “A” em binário é “0100 0001” mas isso na codificação ASCII pode ser que em uma outra codificação o numero “0100 0001” represente o caractere “£”, e geralmente quando se retorna “�” é porque aquele valor não corresponde a nenhum que exista na codificação atual ou seja um numero que não tem uma letra ou caractere assinalado na codificação

também se sua necessidade é criptografia é melhor da uma olhada nas criptografias já mais usadas é comuns como o MD5 e o SHA-2 pode ser que eles te ajude bastante,
além disso você unir uma criptografia com outra por trás faz seu código ser muito mais difícil de decifrar se vc pegar o resultado da sua criptografia e criptografar ela em MD5, se um hacker ver vai pensar a isso é MD5 mas quando descriptografar ele vai ver um resultado loko é vai pensar q deu errado

xD qualquer dúvida só falar

V

mal outro sem nessecidade

matheusgeres

Amigo,

Em minha humilde opinião, converta a string em MD5, o que está ocorrendo é que seu collation, tipo de dados alfanumérico, está incompatível com o Java, que no caso deve ser UTF8. Com MD5 você simplifica tudo isto, o único porém é que não é possível desfazer a chave. Caso você queira manter sua rotina, retire o caracteres especiais e o seu problema também será resolvido.

D

eu não sei se é codificação do banco de dados pois é em firebird 1.5, e o problema é que tenho q acessar base de sistema antigo feito em delphi, como falei essa mesma rotina funciona perfeito em php e delphi.

D

E em java tambem funciona o problema é pegar essa informação da base de dados em java, quando acesso a mesma base usando o delphi e php dá de boa, mas usando o java não rola, isso somente quando pego da base de dados em java

matheusgeres

Não tenha dúvidas, o problema é esse mesmo, a codificação que você está passando do Java para o Firebird não é a mesma, o fato das outras aplicações funcionarem é justamente rodarem já no collation que você necessita.

matheusgeres

Bom, se você grava pelo Java e funciona, pode ser problemas no Driver.
Você tentou gravar pelas suas outras aplicações depois de gravar no banco com o Java?
Já tentou atualizar? Utilizar algum oficial ou genérico? Isso pode gerar erro também.

orlandocn

pare de sofrer

http://www.jasypt.org/

D

eu to usando a biblioteca jaybird-full-2.2.0.jar, a base de dados foi feita em no firebird 1.5, e na minha máquina está instalada o firebird 2.5, rsrs de repente pode ser essas versões desencontradas.

matheusgeres

Não tenha dúvidas, elimine possibilidade a possibilidade, ou utilize a biblioteca que nosso amigo postou, ou passe para MD5, que é padrão em qualquer linguagem.

D

O problema não é outra criptografia, eu poderia está usando base64, md5, o problema é essa rotina que quero que funcione, e na realidade eu até uso md5

matheusgeres

Fico como desafio, você tem os possíveis problemas, será “divertido” achar o problema.

Um abraço.

D

O que parece é que o problema é na biblioteca que está com a codificação UTF-8 e a base de dados está com ISO-8859-1, o problema é que ele só se usa caracteres e sinais diacríticos do ocidente, o desafio agora vai ser informár o charset no momento da conexão.

Vou tentar usar o gbak, para mudar o charset.

ViniGodoy

Nossa, para que você faz isso? Você está usando um algoritmo criptograficamente fraquíssimo e adicionando complicação à toa no código?
Não seria melhor usar MD5 com SALT, ou um algoritmo de criptografia de verdade, já que isso é suportado em todas as linguagens?

D

É como eu falei, eu tenho um sistema antigo feito em delphi, e preciso acessar a base de dados, e descriptografar, esse sistema é de 97, com firibird nem sei se já existia a criptografia md5, e eu hoje já uso md5, mas preciso dessa hotina pra acessar a base antiga e atualizalo.

ViniGodoy

Para não se incomodar com encoding nesse momento, você pode simplesmente criar um map com o valor dos bytes da String no padrão antigo e no novo, e tratar a String como um array de bytes comum.

Afinal, após “decodificado”, você acabará com um texto em ascii padrão na mão.

Criado 13 de abril de 2013
Ultima resposta 15 de abr. de 2013
Respostas 16
Participantes 5