2011-07-27 18 views
10

Estoy tratando de hash algunas contraseñas con SHA2.hash de contraseñas SHA2 en java

¿Dónde puedo obtener un fragmento de código java para hacer eso?

he visto ese puesto pero tengo algo que falta: SHA2 password storage with Java

Mac mac = Mac.getInstance("HmacSha256"); 
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), "HmacSha256"); 
mac.init(secret); 
byte[] shaDigest = mac.doFinal(phrase.getBytes()); 
String hash = ""; 
for(byte b:shaDigest) { 
    hash += String.format("%02x",b); 
} 

La frase es la cadena que quiero codifican ¿verdad? Y lo que es la clave (línea 2)

Gracias de antemano

+0

su información: Usted puede leer algunas preguntas sobre el hash de contraseñas Si bien es bueno cifrar contraseñas, no es trivial hacerlo correctamente. Esta pregunta tiene algunas buenas respuestas: [Sugerencias para contraseñas de biblioteca a hash en Java] (http://stackoverflow.com/questions/2860943/suggestions-for-library-to-hash-passwords-in-java) –

Respuesta

0

frase sería la contraseña que usted está tratando de proteger. key es la sal, una cadena única (y conocida) añadida a su contraseña antes del hashing, para vencer a las tablas del arcoíris. O debería ser, al menos. Tu código solo lo está tomando de la contraseña en sí misma, lo cual es algo sin sentido. Debe ser una cadena aleatoria larga que se almacena junto con el resumen de contraseña.

8

puede considerar el uso de la aplicación de commons-codec

String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password +"salt"); 
+0

Esto no es en Java SE – Supuhstar

22

En primer lugar, es necesario tener claro qué es lo que quiere hacer. Usted dice que quiere cifrar una contraseña, pero el código que está utilizando es para un MAC (Message Authentication Code), específicamente, HMAC.

Hashes y MAC son cosas diferentes para diferentes propósitos (aunque HMAC implica el uso de un hash). Debes estar seguro de que estás usando el correcto para tu requerimiento.

El motivo por el que se le solicita que proporcione una clave es porque los MAC necesitan una clave. Hashes no:

public byte[] hash(String password) throws NoSuchAlgorithmException { 
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");   
    byte[] passBytes = password.getBytes(); 
    byte[] passHash = sha256.digest(passBytes); 
    return passHash; 
} 
10

he modificado el código de un poco de Rossum, añade sal y convertir volviendo tipo de cadena, añadir try/catch, tal vez va a ayudar a alguien:

public String hash(String password) { 
    try { 
     MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); 
     String salt = "some_random_salt"; 
     String passWithSalt = password + salt; 
     byte[] passBytes = passWithSalt.getBytes(); 
     byte[] passHash = sha256.digest(passBytes);    
     StringBuilder sb = new StringBuilder(); 
     for(int i=0; i< passHash.length ;i++) { 
      sb.append(Integer.toString((passHash[i] & 0xff) + 0x100, 16).substring(1));   
     } 
     String generatedPassword = sb.toString(); 
     return generatedPassword; 
    } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }  
    return null; 
} 
Cuestiones relacionadas