2012-02-16 35 views
34

Tengo una cadena que se codificó utilizando el siguiente método, ¿hay alguna manera de decodificar esta cadena de nuevo a su valor original? Gracias.Cómo descifrar cadenas encriptadas SHA-256?

public synchronized String encode(String password) 
     throws NoSuchAlgorithmException, IOException { 

    String encodedPassword = null; 
    byte[] salt = base64ToByte(saltChars); 

    MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
    digest.reset(); 
    digest.update(salt); 

    byte[] btPass = digest.digest(password.getBytes("UTF-8")); 
    for (int i = 0; i < ITERATION_COUNT; i++) { 
     digest.reset(); 
     btPass = digest.digest(btPass); 
    } 

    encodedPassword = byteToBase64(btPass);  
    return encodedPassword; 
} 

private byte[] base64ToByte(String str) throws IOException { 

    BASE64Decoder decoder = new BASE64Decoder(); 
    byte[] returnbyteArray = decoder.decodeBuffer(str); 

    return returnbyteArray; 
} 

private String byteToBase64(byte[] bt) { 

    BASE64Encoder endecoder = new BASE64Encoder(); 
    String returnString = endecoder.encode(bt); 

    return returnString; 
} 

Respuesta

89

SHA-256 es una cryptographic (one-way) hash function, por lo que no hay forma directa de decodificarlo. El propósito completo de una función hash criptográfica es que no puede deshacerlo.

Una cosa que puedes hacer es un brute-force strategy, donde adivina qué fue hasheado, luego hash con la misma función y ve si coincide. A menos que los datos hash sean muy fáciles de adivinar, podría tomar un tiempo de largo.

Puede encontrar la pregunta "Difference between hashing a password and encrypting it" interesante.

+16

Para decirlo de otra manera, si pudieras invertir esta función fácilmente, eso sería realmente algo malo. –

+0

Si es tan difícil regenerar los datos reales o lo dice Brute-force strategy for regeneration, ¿cómo http://md5decrypt.net/en/ & número de otras herramientas en línea regenera la cadena actual? – Safeer

+1

@Safeer Tienen una lista de las salidas de la función hash y luego buscan cuál fue la entrada. En realidad no están descifrando; en esencia, están adivinando y luego siguen los resultados. –

27

Cabe señalar: Sha256 no encripta los datos/contenido de su cadena, en su lugar genera un hash de tamaño fijo, usando su cadena de entrada como semilla.

Siendo este el caso, podría alimentar en el contenido de una enciclopedia, que sería easilly 100 mb de tamaño de texto, pero la cadena resultante aún sería de 256 bits de tamaño.

Es imposible que invierta el hash, para obtener esos 100mb de datos del hash de tamaño fijo, lo mejor que puede hacer es intentar adivinar/calcular los datos de inicialización, hash, y luego ver si el hash coincide con el hash que intentas romper.

Si pudieras invertir el hash, tendrías la mejor forma de compresión hasta la fecha.

+0

"Si pudieras invertir el hash, tendrías la mejor forma de compresión hasta la fecha". No, en realidad no. "Invertir las funciones hash" se refiere a encontrar colisiones. A nadie realmente le importa encontrar la entrada original exacta. De modo que al invertir la función hash solo se obtiene un generador de galimatías. –

+0

Mientras que sí, una colisión puede ocurrir estadísticamente desde diferentes entradas para cualquier algoritmo hashing, más notablemente sha-1 y md5, algunas rutinas hashing más antiguas. Simplemente no han ocurrido aún en la familia sha2. Dado un mp4 - Thor Ragnarok, que es de 1 GB de tamaño Cuando lo haces, obtienes un hash de 256 bit Si pudieras recuperar 1 GB de ese hash de 256 bits Estás tomando 256bits de datos, recuperando 1GB de datos . Si funcionó, entonces sería equivalente a una forma de compresión. Aunque nunca funcionará aunque funcione. Verificar que el hash es correcto requiere el contenido, lo que frustra el propósito. – Baaleos

+0

Sha256 es una aproximación de una función hash perfecta, por lo que puede esperar que cada salida posible tenga en promedio otra entrada con una longitud de 256 bits que se asigna a esa salida. No hay ninguna razón por la que un retroceso exitoso llegara tan lejos como devolver la entrada original de 1GB cuando solo puede devolver una de las entradas de ~ 256 bit que devuelve esa salida, es decir, obtendrá una pequeña porción de galimatías. Entonces, incluso si pudieras revertir, nunca podrías usar eso para ningún tipo de compresión. –

3

Has hecho lo correcto mediante el uso de una sal alias SSHA.

¡SHA y SHA-2 (o SHA-256) por sí mismo sin una sal ya no se consideran seguros! Salar un hash SHA se llama SHA salado o SSHA.

A continuación se muestra un ejemplo simple de lo fácil que es eliminar el hash SHA-1. Lo mismo se puede hacer por SHA-2 sin demasiado esfuerzo también.

Introduzca una contraseña en este URL: http://www.xorbin.com/tools/sha1-hash-calculator Copiar el hash en esta URL: http://www.hashkiller.co.uk/sha1-decrypter.aspx

Aquí hay una página, que de-hash SHA-2. La forma en que funcionan estas páginas es que alguien debe haber cifrado su contraseña antes, de lo contrario no la encontrará: md5hashing dot net/hash/sha256

Aquí hay una página que dice tener listas completas de SHA-2 disponibles para descargar una "donación" (aún no lo he probado): crackstation dot net/buy-crackstation-wordlist-password-cracking-dictionary.htm

Aquí hay un buen artículo que explica por qué tiene que usar SSHA sobre SHA : crackstation dot net/hashing-security.htm

1

SHA * es una función hash. Crea una representación (hash) de los datos originales. Este hash nunca debe utilizarse para recrear los datos originales. Por lo tanto, no es encriptación. Más bien, la misma función hash se puede usar en 2 ubicaciones diferentes en los mismos datos originales para ver si se produce el mismo hash. Este método se usa comúnmente para la verificación de contraseñas.