Criptografia em SHA-1!

Seguinte pessoal… tenho uma aplicaçao em aspx que faz criptografia em SHA1 na senha do usuario !!!

Gostaria de saber c eu fizer uma criptografia em SHA-1 em java é possivel comparar com o SHA-1 que foi gerado pelo aspx e incluido no BD??? Que eu saiba sim, porem a criptografia q o java esta gerando esta totalmente diferente do que esta no banco de dados !!!

Segue o codigo de criptografia q estou usando:

String senha =""; try { MessageDigest criptografar = MessageDigest.getInstance("SHA-1"); criptografar.digest(textPassword.getText().getBytes()); BASE64Encoder encoder = new BASE64Encoder (); senha = encoder.encode(criptografar.digest()); } catch (NoSuchAlgorithmException e1) { e1.printStackTrace(); }

VLW

Você está utilizando BASE64 para codificar o seu hash no aspx? Tente comparar com o digest sem fazer o encode…

Só uma perguntinha. Digamos que a senha do usuário seja "joão".
Qual é o valor do SHA-1 que a aplicação ASP.NET está gerando?

Abaixo anexo um programa que tenta várias codificações de strings no Java e seus SHA-1 correspondentes.

import sun.misc.*;
import java.security.*;

class TesteSHA1 {
    
    private void printSHA1 (byte[] bytes) throws Exception {
        MessageDigest sha1 = MessageDigest.getInstance ("SHA-1");
        BASE64Encoder enc = new BASE64Encoder();
        byte[] sha1Bytes = sha1.digest (bytes);
        
        System.out.println ("Bytes: ");
        for (int i = 0; i &lt bytes.length; ++i) {
            System.out.print (Integer.toHexString ((bytes[i] & 0xFF) | 0x100).substring(1).toUpperCase() + " ");
        }
        System.out.println ();
        System.out.println ("SHA-1 = " + enc.encode (sha1Bytes));
    }
    public void teste(String senha) throws Exception {
        System.out.println ("Codificação UTF-16LE");
        printSHA1 (senha.getBytes("UTF-16LE"));
        System.out.println ("Codificação UTF-16BE");
        printSHA1 (senha.getBytes("UTF-16BE"));
        System.out.println ("Codificação UTF-8");
        printSHA1 (senha.getBytes("UTF-8"));
        System.out.println ("Codificação ISO-8859-1");
        printSHA1 (senha.getBytes("ISO-8859-1"));
        System.out.println ("Codificação Windows-1252");
        printSHA1 (senha.getBytes("Windows-1252"));
    }
    
    public static void main(String[] args) throws Exception {
        TesteSHA1 t = new TesteSHA1();
        String senha = "joão";
        System.out.println ("Tentando com a senha \"" + senha + "\"");
        t.teste(senha);
    }
}

O resultado do programa acima para a senha "joão".

Tentando com a senha "joão"
Codificação UTF-16LE
Bytes: 
6A 00 6F 00 E3 00 6F 00 
SHA-1 = V2VvSeumHWeCk8k2o4w09GcuowQ=
Codificação UTF-16BE
Bytes: 
00 6A 00 6F 00 E3 00 6F 
SHA-1 = GI8N9mzvPeoQAArOWNhv1gqp1ZI=
Codificação UTF-8
Bytes: 
6A 6F C3 A3 6F 
SHA-1 = nx0cGTaGVt+4SMadVw87mNG7zDM=
Codificação ISO-8859-1
Bytes: 
6A 6F E3 6F 
SHA-1 = 47Tb0ToGc5w8Z5YZHi4Q4YqPa1Y=
Codificação Windows-1252
Bytes: 
6A 6F E3 6F 
SHA-1 = 47Tb0ToGc5w8Z5YZHi4Q4YqPa1Y=

Acho q me expressei mal… seguinte, a criptografia gerada pelo aspx esta armazenada no BD. Eu prefiso fazer a criptografia igual a do aspx para gerar o mesmo SHA-1 para eu comparar com o q tem no BD

Eu rodei o programa acima e nao deu o hash q tem no BD!!!

Alguem sabe se é possivel fazer o q eu quero ??

Já tive problemas com criptografia também. Seguinte, dependendo do ambiente eu sei que tem diferença, mas o maior problema é o seguinte: quando você faz o digest de uma string, você deveria gerar um código hexadecimal deste digest e gravá-lo no banco. Por quê? Simples: porque a maioria dos caracteres não ASCII são perdidos, mudados para outras coisas (como a interrogação " ? "). Ô thingol, foi você mesmo quem me deu o toque… lembrado? Será que o caso dele não é o mesmo meu?

Temos um sistema hoje rodando no MySQL e precisamos migrar ele para o Oracle. Infelizmente não tivemos como migrar as senhar por causa desse “probleminha” que não tinha sido previsto por quem desenvolveu a “criptografia” da senha. Ou seja, vamos ter de gerar novas senhas. Solução? Alteramos a forma de gravar no banco (gerando hexadecimal) e zeramos as senhas de todos os usuários. Pelo menos se tivermos que migrar novamente de banco não vamos ter problemas.

pessoal,

alguem poderia me ajudar… estou começando a estudar criptografia…

eu precisava de um exemplo simples de uma classe que criptografa uma string em sha-1 e outra classe que conseguisse ler o dado criptografado…

eu vou guardar esse dado em um banco e precisava de um código para conseguir ler esse dado criptografado…

se alguem puder dizer pelo menos por onde eu começo… ou me der umas dicas…

obrigado pela atenção…

O exemplo para calcular o SHA-1 de uma string já foi postado neste mesmo tópico. Para ler o tal dado, procure por “JDBC”.

olá… eu já consegui criptografar a string…

sei que eu devo armazena-la criptografada no banco e compará-la com a String criptografada que o usuário digitar…

mas minha dúvida agora é: tem como eu passar uma chave para alguem conseguir ler este dado criptogrado…
e se tem como, alguem sabe a maneira de fazer isso…

Vou explicar pela enésima vez:

SHA-1, MD5 e outros algoritmos de hash não fazem criptografia.
O que eles fazem é achar um número que está relacionado com a sua entrada.
Esse número pode ser o mesmo para entradas diferentes, mas a probabilidade é infinitesimal.
Portanto, se você fizer duas entradas e o hash bater, então supõe-se que as entradas são as mesmas.
Você pode, por exaustão, tentar achar uma senha que bata com a senha que está cadastrada no banco (por exemplo, digamos que no banco tivéssemos cadastrado o SHA-1 “47Tb0ToGc5w8Z5YZHi4Q4YqPa1Y=” e eu soubesse que o nome do seu filho é “João”, da sua esposa “Maria” e do seu cachorro “Totó”. Eu tentaria achar algumas palavras cujo SHA-1 batesse - tentaria, por exemplo, “João”, “joão”, “joao”, “Maria”, “MARIA”, “maria” etc.). Mas não dá para achar uma chave que abra TODAS as senhas.

ah tah… agora eu entendi…

valeu mesmo pela explicação, agora fikou claro para mim…

:slight_smile: