Ver mensagens sem resposta | Ver tópicos ativos Hoje é 22 Nov 2017, 18:56



Responder Tópico  [ 3 Mensagens ] 
 Login com Sqlite + Criptografia 
Autor Mensagem
Google employee
Google employee

Data de registro: 01 Jul 2013, 13:45
Mensagens: 2688
Localização: Rio de Janeiro
Mensagem Login com Sqlite + Criptografia
O projeto usado aqui está nesse link: viewtopic.php?f=7&t=27047
As alterações feitas foram:

• Validação dos campos de cadastro e login
• Um ProgressDialog rodando durante o cadastro e o login
• Validar no cadastro se o usuário já existe
• Criptografar a senha do usuário


Na primeira alteração, crie os métodos getDialog() e avisos(), que serão usados em conjunto nas classes Cadastro e Login.

Cadastro.java


    private String avisos() {
        StringBuilder sb = new StringBuilder();
       
        if (getString(nomeDeUsuario).length() < 3) {
            sb.append("O nome de usuário deve ter no mínimo 3 caracteres.\n");
        }
        if (getString(senha).length() < 5) {
            sb.append("O senha deve ter no mínimo 5 caracteres.\n");
        }
        if (getString(nome).length() == 0) {
            sb.append("Você precisa informar seu nome.\n");
        }
        if (getString(sobrenome).length() == 0) {
            sb.append("Você precisa informar seu sobrenome.\n");
        }
        if (getString(idade).length() == 0) {
            sb.append("Você precisa informar sua idade.\n");
        }
        return sb.toString();
    }
 


Login.java

   
    private String avisos() {
        StringBuilder sb = new StringBuilder();

        if (getString(nome).length() < 3) {
            sb.append("O nome de usuário deve ter no mínimo 3 caracteres.\n");
        }
        if (getString(senha).length() < 5) {
            sb.append("O senha deve ter no mínimo 5 caracteres.\n");
        }
        return sb.toString();
    }
 


Esse método deve estar em ambas as as classes:


    private Builder getDialog(String aviso) {
        Builder alerta = new Builder(this);

        alerta.setTitle("Aviso");
        alerta.setMessage(aviso);
        alerta.setIcon(android.R.drawable.ic_dialog_info);
        alerta.setNeutralButton("Alterar", null);

        return alerta;
    }
 


E cada listener deve ficar assim:


    // classe Cadastro
    private OnClickListener oclConfirmar = new OnClickListener() {
        public void onClick(View v) {
            Criptografia cripto = Criptografia.getInstancia(getString(senha));
            CadastroAsyncTask cadastro = new CadastroAsyncTask();
           
            String aviso = avisos();
           
            if (aviso.length() > 0) {
                getDialog(aviso).show();
            } else {
                Usuario usuario = new Usuario();
               
                usuario.setNomeDeUsuario(getString(nomeDeUsuario));
                usuario.setSenha(cripto.getSenhaCriptografada());
                // outros sets
               
                cadastro.set(Cadastro.this, dao, usuario);
                cadastro.execute();
            }
        }
    };
   
    // classe Login
    private OnClickListener oclEntrar = new OnClickListener() {
        public void onClick(View v) {
            Criptografia cripto = Criptografia.getInstancia(getString(senha));
            LoginAsyncTask login = new LoginAsyncTask();
             
            login.set(Login.this, dao);
            login.set(getString(nome), cripto.getSenhaCriptografada());
           
            String aviso = avisos();
           
            if (aviso.length() > 0) {
                getDialog(aviso).show();
            } else {
                login.execute();
            }
        }
    };
 


As classes CadastroAsyncTask e LoginAsyncTask fazem as validações necessárias, enquanto um ProgressDialog é mostrado ao usuário. Se mostrar aqui vai ficar muito grande o post, mas tá no link do projeto. Se quiser dar uma olhada, eu tirei desse tutorial do Gusukuma: viewtopic.php?f=7&t=17488. Elas estão bem simples... Só rodam o dialog um tempinho e verifica no onPostExecute() qual a ação deve ser tomada.
Agora, pra verificar se o usuário já existe, reescreva o método equals() na classe Dao. Ele vai ser usado na CadastroAsyncTask:


    @Override
    public boolean equals(Usuario usuario) {
        boolean existe = false;
        SQLiteDatabase sqlite = loginSqlite.getReadableDatabase();

        String nome = usuario.getNomeDeUsuario();
        String sql = "SELECT nomeDeUsuario FROM usuario WHERE nomeDeUsuario = '" + nome + "'";

        Cursor cursor = sqlite.rawQuery(sql, null);
        try {
            if (cursor.moveToNext()) {
                existe = true;
            }
        } finally {
            cursor.close();
            sqlite.close();
        }
        return existe;
    }
 


E por último, a classe responsável por criptografar as senhas:


public class Criptografia extends Object {
   
    private char[] alfa = new char[52];
    private char[] nume = new char[10];

    private String letras = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ";
    private String numeros = "0123456789";

    private HashMap<Character, String> valores = new HashMap<Character, String>();
    private String senha = "senha";

    private static Criptografia criptografia = new Criptografia();

    public static Criptografia getInstancia(String senha) {
        criptografia.setSenhaOriginal(senha);
        return criptografia;
    }

    public String getSenhaCriptografada() {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < senha.length(); i++) {
            sb.append(valores.get(senha.charAt(i)));
        }
        return sb.toString();
    }

    private void setSenhaOriginal(String senha) {
        this.senha = senha;
       
        for (int i = 0; i < 52; i++) {
            if ((i % 2) == 0) { // minúsculas
                valores.put(alfa[i], String.format("%02X", logica((senha.length() * i) % 2014)));
            }
            else if ((i % 2) != 0) { // maiúsculas
                valores.put(alfa[i], String.format("%02x", logica((senha.length() * i) % 2013)));
            }
        }
        for (int i = 0; i < 10; i++) {
            if ((i % 2) == 0) { // pares
                valores.put(nume[i], String.format("%02X", logica((senha.length() * i) % 2012)));
            }
            else if ((i % 2) != 0) { // ímpares
                valores.put(nume[i], String.format("%02x", logica((senha.length() * i) % 2011)));
            }
        }
    }

    // Método com a lógica pra gerar os valores
    private long logica(long n) {
        long cubo = n * n * n;

        long x = cubo + 157;
        long y = (cubo * n) * (21 * 2007);

        return 2 + x + y;
    }

    private Criptografia() {
        for (int i = 0; i < 52; i++) {
            alfa[i] = letras.charAt(i);
        }
        for (int i = 0; i < 10; i ++) {
            nume[i] = numeros.charAt(i);
        }
    }
}
 


• No construtor, o laço preenche os arrays de chars com cada char das Strings letras e numeros.
• O método logica() é o que faz o cálculo doido pra gerar os valores. Faça a sua própria implementação.
• O setSenhaOriginal() usa um laço pra ir jogando as chaves (cada letra/numero) e os valores (um hexadecimal do retorno do método logica()), diferenciando letras maíusculas de minúsculas e números pares de ímpares.
• O getSenhaCriptografada() apenas joga cada valor num StringBuilder e retorna a String completa.

Eu até cheguei a usar MD5 pra criptografar, só que eu queria saber como funcionava esse processo e fiz o meu próprio algorítimo! Quem quiser fazer um já tem uma ideia de como funciona. :D
E pra quem já sabe, aviso que eu não pesquisei sobre como se cria uma parada dessas, apenas imaginei e fiz. Claro que não é aquela coisa que se diga "nossa, como essa criptografia é tão criptografada!", mas dá pra quebrar um galho. Então, qualquer dica de melhoria nessa classe será muito bem aceita.

_________________
Quando seu problema for resolvido, clique na opção Editar no lado superior direito da sua primeira mensagem e coloque [Resolvido] no título.
Se resolveu o problema sozinh@, não esqueça de postar a solução, ela ajuda usuários em buscas no fórum.
Use os marcadores java e xml quando for postar.

Aprenda Java com esta apostila.


17 Abr 2014, 13:26
Perfil WWW
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: Login com Sqlite + Criptografia
Kaito, tem como reverter a criptografia só de olhar esse código ae?

_________________
Powell


17 Abr 2014, 13:33
Perfil
Google employee
Google employee

Data de registro: 01 Jul 2013, 13:45
Mensagens: 2688
Localização: Rio de Janeiro
Mensagem Re: Login com Sqlite + Criptografia
Quando eu o fiz a ideia era de ser unidirecional, mas não deu muito certo não... Com as senhas que eu fui testando, coloquei duas letras iguais em posições diferentes. Dava pra saber quais eram as letras iguais. Mas sendo uma criptografia própria, deve dificultar que ela seja revertida na senha original. Também vai depender da implementação do logica() e do tamanho da senha, mas como não foi feita pra usar pelos governos mundiais, deve servir. :D

_________________
Quando seu problema for resolvido, clique na opção Editar no lado superior direito da sua primeira mensagem e coloque [Resolvido] no título.
Se resolveu o problema sozinh@, não esqueça de postar a solução, ela ajuda usuários em buscas no fórum.
Use os marcadores java e xml quando for postar.

Aprenda Java com esta apostila.


17 Abr 2014, 13:53
Perfil WWW
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 3 Mensagens ] 

Quem está online

Usuários vendo este fórum: ademir.carvalhojr, aechiara, alberto, alex.abrantes, andepunk, Andreid, Aparec, arquivo51, azero, b7web, bernardodauer, Blackstorm, bocajunior88, BOMBER27, bravus, brpiassa, Brunohc, buccalon, cabelo, Captain Typho, Carlos Almeida, carlos rodrigues, cesschneider, Chaves, Chewbacca, cleberkct, compto, culumin, Daniel Batista, Darth Maul, DAVINCE, Dirceu W. C. Conte, dirceuconte, dnakamashi, Dookan, e-azuos, ederson_4, edervieira, eduardo.ali, edwarvelarde, elisa, eluttner, Erik Patekoski, EvertonLB, fabric01, fabrizior, fcoroa, felipecomp19, fernandodotnet, ferrodecaju, Flavio, flaviocc, francismarconcini, free_w3000, furlanrapha, gapler, Google Android, guilhermesmo, HAMSES, hostdesigner, Ielo8, inaciofernandes, j-menezes, jacksaum, jairo, jandersonjc, jeanbr07, JeffCF, JMurray, Joessi2007, Katia, klausenner, klyff, lanlan, lazarodm, leosl81, linukiss, luizcyber, luizfilipe, Luke Skywalker, Mace Windu, Marcelo, Marcelo Lima, MarceloLuz, MarceloMC, marcelosv, marciosoliveira, marcow, marianatallas, Marini, Marlosm, mcurtis, Meticore, Microdesk, mikasjau, monteirojp, MSPRAFAEL, Nidio Dolfini, nq6, Nute Gunray, onedroid, Padawan, pemam.com.br, persiomotta, Princesa Léia Organa, rafael.winter, rafaelvital, Rainha Amidala/Padmé, raulcca, regeriob2br, reginaldo, renata, retardad0, rfrafael, rguadagnini, ricdigital, rosano, Rubens Prates, sergio, sidnei.gs, Silvio Vaz, tChAnDy, Telekom [Bot], tiagocomerio, tiagocordeiro, ton.soares, ubiratan, Vania, Velhinho, VILESOFT, vilmartr, viniciusgoncalves, viniciusllima, voliverio, waideman, WiseNut, Wookiees, woyzeck, xa:=zin, xikin, YaCy, Zam Wesell, zaquiel, zenden1503 e 1 visitante


Você não pode criar novos tópicos neste fórum
Você não pode responder tópicos neste fórum
Você não pode editar suas mensagens neste fórum
Você não pode excluir suas mensagens neste fórum
Você não pode enviar anexos neste fórum

Procurar por:
cron

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi