[RESOLVIDO][Criptografia SHA] O que é o byte? como pegar o código em SHA e não HEX?
10 respostas
Poneis123
Pessoal,
Estou começando a mexer com a criptografia SHA, o que entendi até agora é que pega-se o getBytes() de uma string, dessa matriz de byte é criado um código através do algoritmo SHA, e que do byte[] desse código é transformado pra hexa para que não contenha caracter especial, é isso?
Gostaria de saber se quando eu chamo o MessageDigest.digest() a matriz de byte q é retornada é a matriz de byte do código SHA? como eu consigo o código gerado pelo algoritmo SHA? por que trabalhamos com os bytes dos dados?
Esse tipo de criptografia não envolve chaves sendo assim, a forma para mascaras esse tipo de informação é simplesmente, não conseguir fazer a engenharia reversa no mesmo. Esse tipo de algoritmo faz uso do que chamamos de “Algoritmos de Espalhamento”.
Sendo assim, caso voce queria validar se um conteúdo de um string qualquer é o conteúdo cripgrafado, a única forma é voce aplicar o algoritmo (no caso o SHA) e comparar o resultado.
eu menti um pouco…na verdade, já é possível fazer eng reversa em MD5 e SHA1 =)
Poneis123
kkkkkk entendi, o ideal era q não tivesse a eng reversa né rs
Eu fiz a pergunta, mas fuçando um pouco aqui eu entendi:
É que a forma que eu to usando ele pega o código gerado pelo algoritmo SHA e transforma o byte dele em hexadecimal… pra descobrir exatamente o código SHA gerado pelo algoritmo basta usar por exemplo:
String senha = "abc123";
MessageDigest md = MessageDigest.getInstance( "SHA" );
md.update(senha.getBytes());
byte[] byteSHA = md.digest();
System.out.println("Conversão da senha em SHA : " + new String(byteSHA));
E
entanglement
Nunca converta um array de bytes para uma string com new String(byte[]), assim como você fez. É que isso costuma alterar alguns bytes para valores incorretos.
Converta o array de bytes para hexadecimal. Uma forma de fazer isso é com esta função:
Mas converte-lo para hexa não é a solução de new String(byte[]), são coisas diferentes…
eu to pegando o valor em byte[] e convertendo pra string… é o inverso de “abc”.getBytes() que me retorna um byte[] a partir de uma String, eu to voltando o byte para a String.
Deu pra entender o q eu to fazendo? Se tiver outra forma de se fazer isso posta ae.
Valew brother!
M
marcobiscaro2112
É mesmo? Dessa eu não sabia… Você poderia dar mais detalhes?
E
entanglement
Claro que entendi. Quando você obtém o SHA-1 de alguma coisa, obtém 20 bytes que podem ser considerados “completamente aleatórios”, no sentido que todos eles podem ir de 0 até 255. Só que se você usar new String(byte[]) em um array de bytes desse tipo, vai dar problemas, porque cerca de 30 valores possíveis entre 0 até 255 não são convertidos corretamente de byte[] para char usando new String(byte[]). Eles são convertidos para o caracter ‘?’, e isso vai dar problemas sérios.
A única maneira de você ter um resultado confiável, se for converter um array de bytes para string, é convertê-lo para hexadecimal (como fiz) ou outra representação como base-64. Nunca use diretamente new String(byte[]) a menos que você saiba o que está fazendo (que não é, obviamente, o caso).
Poneis123
entanglement, Agora entendi!! realmente, quando eu faço essa conversão me traz uma string toda doida… se eu apresentar ela na tela e usar um ctrl+c nela pra colar em outro lugar já era… perde alguma coisa no meio do caminho… acredito eu q seja pq alguns desses bytes não são representados graficamente né? mas se eu utilizar essa String para passar para outro lugar e voltar a pegar o getBytes() dele funciona normal… só não posso confiar na String que é apresentada na tela.
Valew pela ajuda ae, clareou totalmente.
E
entanglement
Funciona normal uma ova. Vou mostrar aqui que não funciona normal coisa nenhuma.
class TesteGetBytes {
public static void main(String[] args) {
byte[] bytes = new byte[256];
for (int i = 0; i < 256; ++i) {
bytes[i] = (byte) i;
}
System.out.printf ("Comprimento do array de bytes original = %d %n", bytes.length);
String s = new String (bytes);
byte[] bytes2 = s.getBytes();
System.out.printf ("Comprimento do array de bytes final = %d %n", bytes2.length);
for (int i = 0; i < 256; ++i) {
if (bytes[i] != bytes2[i]) {
System.out.printf ("Byte %02X: original = %02X != final = %02X %n", i, bytes[i] & 0xFF, bytes2[i] & 0xFF);
}
}
}
}
Rode o programa acima. Você vai obter o seguinte resultado em uma máquina Windows:
Conclusão: NUNCA CONVERTA UM ARRAY DE BYTES PARA UMA STRING SEM SABER O QUE VOCÊ ESTÁ FAZENDO. VOCÊ NÃO SABE O QUE ESTÁ FAZENDO.
O
ozix
Só um detalhe conceitual: criptografia pressupõe uma função reversível, ou seja, é possível voltar ao texto claro a partir do texto criptografado com a função de decifragem. Funções como SHA-1 ou MD5 são chamadas funções hash, onde o retorno ainda que possível é inviável. E essa é só uma das diferenças.
Poneis123
entanglement, de todos os bytes q vc passou 5 deram erro para voltar. No meu funcionou normal a volta pq não usa esses bytes =P mas é realmente arriscado se não se sabe o conteúdo da String.