Criptografia - Segurança

16 respostas
B

Olá,

Estou desenvolvendo um novo modulo para uma página na internet que é a alteração de cadastro. Existe hoje mais de 10.000 usuarios cadastrados, mas o campo de senha por ele desenvolvido anteriormente foi o password do MYSQL.

Já vi aqui diversas maneiras de usar MD5 ou SHA1, mas até agora não encontrei uma formula de utilizar o password do MYSQL em Java.

Se alguem tiver alguma idéia ou já passou por este problema, agradeço :smiley:

16 Respostas

T

Só uma coisa. Qual é a versão do MySQL que você está usando? A função PASSWORD funciona de modos diferentes se a versão for 4.1 (o campo PASSWORD tem 45 bytes) ou anterior à 4.1 (só tem 16 bytes).

http://dev.mysql.com/doc/mysql/en/Password_hashing.html

Rodrigo_Carvalho_Aul

Não entendi… vc quer desincriptar a senha pra mostrar pro usuário? Se for, esquece.

E sejá quem fez isso, fez besteira, a própria documentação do MySql faz o seguinte alerta:

http://dev.mysql.com/doc/mysql/en/Encryption_functions.html#IDX1467

[]'s

B

Olá

Realmente eu sei que os caras que desenvolveram antes o sistema fizeram mesmo besteira usuando o password, tb li isso na documentação do MySQL. Mas agora está mesmo praticamente em um caminho sem volta, imagino, pois tem mais de 10.000 usuarios cadastrados com este tipo de senha.

Não quero não desincriptar, apenas dar ao usuário a chance de ele mudar sua senha.

A versão que está hospedada é na locaweb 3.23.58 e usa mesmo 16 bytes.

Estou trabalhando com o hibernate. Mas posso tb utilizar outros meios.

Obrigado a todos
:slight_smile:

louds

Baixa o fonte do mysql e porta o código pra java :wink:

Rodrigo_Carvalho_Aul

Bom, se não mudou a versão do MySql e vc só quer dar a chance do usuário mudar a senha, então não vejo problema nenhum…

Qual problema vc tá enfrentando?

[]'s

B

Gostaria de usar algo mais em java para estar gerando as novas senhas como é feito com o MD5 ou SHA1.

Mas não encontrei nada parecido, o problema de eu usar conexão direta via JDBC é que estou com outro projeto aqui já todo implementado com hibernate.

Qual seria a solução utilizando hibernate.?

T

O que o Louds disse acho que é a única solução, mas pelo jeito isso não é impossível de fazer (está no arquivo mysqllib/password.c ).
A tal função foi implementada no MySQL e no PHP, provavelmente alguém implementou-a em Java, o problema é achar isso no Google (que nome mais ingrato para uma função, tentei a consulta “MySQL Password Java” mas não consegui nada interessante.)

T

Você pode fazer um favor para mim? Me imprima o valor da expressão PASSWORD(“CAFEBABE”).

Achei este fonte em C no MySQL, mas para converter este fonte para Java eu preciso saber exatamente o que o MySQL vai retornar como resultado da expressão acima. (Pode ser que tenha de inverter ordens de bytes, ou outras coisas mais cabeludas).

void hash_password(ulong *result, const char *password)
{
  register ulong nr=1345345333L, add=7, nr2=0x12345671L;
  ulong tmp;
  for (; *password ; password++)
  {
    if (*password == ' ' || *password == '	')
      continue;			/* skipp space in password */
    tmp= (ulong) (uchar) *password;
    nr^= (((nr & 63)+add)*tmp)+ (nr << 8);
    nr2+=(nr2 << 8) ^ nr;
    add+=tmp;
  }
  result[0]=nr & (((ulong) 1L << 31) -1L); /* Don't use sign bit (str2int) */;
  result[1]=nr2 & (((ulong) 1L << 31) -1L);
  return;
}
void make_scrambled_password(char *to,const char *password)
{
  ulong hash_res[2];
  hash_password(hash_res,password);
  sprintf(to,"%08lx%08lx",hash_res[0],hash_res[1]);
}
B

Hum…muito interessante…

o resultado será

4ddeecf3238a744d

:smiley:

[]s

T

Não tenho aqui comigo um MySQL rodando. Veja se a função “password” funciona igual à “PASSWORD” da sua versão do MySQL.
Se funcionar me avisa, que aí eu vou deixar isso “oficial”.

class MySQLPassword {
    public static String password(String pwd) {
        int nr = [telefone removido];
        int add = 7;
        int nr2 = 0x12345671;
        int tmp;
        byte[] byPassword = null;
        try {
            byPassword = pwd.getBytes("ISO8859-1"); //-- quase ANSI Windows
        } catch (java.io.UnsupportedEncodingException ex) {
            System.err.println ("UnsupportedEncodingException");
        }
        for (int i = 0; i < byPassword.length; ++i) {
            if (byPassword[i] == ' ' || byPassword[i] == '	')
                continue;
            tmp = byPassword[i] & 0xFF;
            nr ^= (((nr & 63) + add) * tmp) + (nr << 8);
            nr2 += (nr2 << 8) ^nr;
            add += tmp;
        }
        int result0 = nr & 0x7FFFFFFF;
        int result1 = nr2 & 0x7FFFFFFF;
        long result = ((long)result0 << 32) | result1;
        String strResult = "0000000000000000" + Long.toHexString(result);
        return strResult.substring(strResult.length() - 16);
    }
    public static void main(String[] args) {
        System.out.println (password("CAFEBABE"));
    }
}
T

Que legal, então pegue esse fonte que postei, e teste com senhas com acentos, senhas vazias e outras coisas esquisitas que podem ocorrer. (Se quando você testar senhas com acentos não funcionar direito, em vez de ISO8859-1 você pode trocar por outra codificação, não sei direito qual é a codificação oficial do Windows. Tentei “CP-1252” mas ele me lançou uma exceção.

T

Isso que é legal no Open Source, se quiser fazer alguma coisa e souber como fazer, é só pegar o fonte, traduzir, testar e está tudo certo…

Agora mais um café.

B

Perfeito cara!!! :smiley:

Está funcionando perfeitamente até para caracteres estranhos e diferentes funcionou.

Muito bom cara parabens mesmo e obrigado

Uma das ressalvas que faço é que espaço duplo que ele reconhecia lá em C e ignorava não está acontecendo em Java por não reconhecer caracter com mais de um espaço, mas isso é facil adaptar até.

E como eu disse irei usar no Linux, que está hospedado na locaweb, trará algum problema usar a codificação “ISO8859-1” :?:

Muito obrigado novamente, estou te devendo não um café…mas vários…hehehehe

valeus

até mais

[]s

T

Caracter com mais de um espaço? Isso é coisa do código do fórum. Eu postei “\t” e ele mostra " ".
Quanto a ISO8859-1 isso não tem problema (acho).

louds

Usar o ISO-8859-1 é ate melhor que US-ASCII já que o mysql usa o primeiro para enconding de texto.

T

É bom saber disso, eu não sou especialista no MySQL - na verdade uso mais o Oracle e o MS SQL Server, e o HSQLDB de vez em quando. Então foi um “chutão” certeiro… :sleeping:

Criado 27 de setembro de 2004
Ultima resposta 27 de set. de 2004
Respostas 16
Participantes 4