password encrypt java security hash passwords sha512

encrypt - ¿Cómo hash una contraseña con SHA-512 en Java?



hash password java (8)

He estado investigando un poco sobre las técnicas de encriptación de Java String y, desafortunadamente, no he encontrado ningún buen tutorial sobre cómo aplicar hash con SHA-512 en Java; Leí algunos blogs sobre MD5 y Base64, pero no son tan seguros como me gustaría (en realidad, Base64 no es una técnica de encriptación), así que prefiero SHA-512.


¡Por favor deja de usar las funciones hash para codificar contraseñas! Ellos no proporcionan la protección que necesita. En su lugar, debe utilizar un algoritmo como PBKDF2, bcrypt o scrypt.

Referencias:


Con el hashing seguro, combine 3 componentes de sal (de 150 caracteres aleatorios cada uno) en un usuario individual de sal (usuario de la tabla de la base de datos del usuario, sal general en una tabla de la base de datos (cambio mensual con el trabajo cron) y oculte algo de sal en la biblioteca de la aplicación) . Alinee la cantidad de bucle for del hash seguro a sus necesidades. Vea la respuesta anterior para el método de hash.

private static String generateSalt(int lenght){ String abcCapitals = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; String abcLowerCase = "abcdefghijklmnopqrstuvwxyz"; String numbers = "01234567890123456789"; String characters = "!@#$%^&*!@#$%%^^&*"; String total = abcCapitals + abcLowerCase + numbers + characters; String response = ""; char letters[] = new char[lenght]; for (int i=0; i<lenght-1; i++){ Random r = new Random(); char letter = total.charAt(r.nextInt(total.length())); letters[i] = letter; } response = Arrays.toString(letters).replaceAll("//s+",""); response = response.replaceAll(",",""); return response; } private static String getHash(String passwordToHash, String salt){ String generatedPassword = null; try { MessageDigest md = MessageDigest.getInstance("SHA-512"); md.update(salt.getBytes(StandardCharsets.UTF_8)); byte[] bytes = md.digest(passwordToHash.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for(int i=0; i< bytes.length ;i++){ sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); } generatedPassword = sb.toString(); } catch (NoSuchAlgorithmException e){ System.out.println(e); } return generatedPassword; } public static String getSecureHash(String password, String salt){ String hash = getHash(password, salt); for (int i=0; i<20000; i++){ hash = getHash(password, hash); } return hash; } /** * @param args the command line arguments */ public static void main(String[] args) { String salt = generateSalt(150); String salt2 = generateSalt(150); String salt3 = generateSalt(150); String someString = "This is some string!"; String hash = getSecureHash(someString, salt + salt2 + salt3); System.out.println(hash); }


Los siguientes son los algoritmos de hashing estándar proporcionados por el Java MessageDigest:

  1. MD2
  2. MD5
  3. SHA-1
  4. SHA-256
  5. SHA-384
  6. SHA-512

Es posible que desee verificar el nombre que está suministrando al método de fábrica.


Puedes usar esto para SHA-512

import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public String get_SHA_512_SecurePassword(String passwordToHash, String salt){ String generatedPassword = null; try { MessageDigest md = MessageDigest.getInstance("SHA-512"); md.update(salt.getBytes(StandardCharsets.UTF_8)); byte[] bytes = md.digest(passwordToHash.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for(int i=0; i< bytes.length ;i++){ sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); } generatedPassword = sb.toString(); } catch (NoSuchAlgorithmException e){ e.printStackTrace(); } return generatedPassword; }



Utilizando Guava :

Hashing.sha512().hashString(s, StandardCharsets.UTF_8).toString()


puede usar esto para codificar una contraseña en java si lo desea.

public static boolean isHashMatch(String password, // the password you want to check. String saltedHash, // the salted hash you want to check your password against. String hashAlgorithm, // the algorithm you want to use. String delimiter) throws NoSuchAlgorithmException // the delimiter that has been used to delimit the salt and the hash. { // get the salt from the salted hash and decode it into a byte[]. byte[] salt = Base64.getDecoder() .decode(saltedHash.split(delimiter)[0]); // compute a new salted hash based on the provided password and salt. String pw_saltedHash = computeSaltedBase64Hash(password, salt, hashAlgorithm, delimiter); // check if the provided salted hash matches the salted hash we computed from the password and salt. return saltedHash.equals(pw_saltedHash); } public static String computeSaltedBase64Hash(String password, // the password you want to hash String hashAlgorithm, // the algorithm you want to use. String delimiter) throws NoSuchAlgorithmException // the delimiter that will be used to delimit the salt and the hash. { // compute the salted hash with a random salt. return computeSaltedBase64Hash(password, null, hashAlgorithm, delimiter); } public static String computeSaltedBase64Hash(String password, // the password you want to hash byte[] salt, // the salt you want to use (uses random salt if null). String hashAlgorithm, // the algorithm you want to use. String delimiter) throws NoSuchAlgorithmException // the delimiter that will be used to delimit the salt and the hash. { // transform the password string into a byte[]. we have to do this to work with it later. byte[] passwordBytes = password.getBytes(); byte[] saltBytes; if(salt != null) { saltBytes = salt; } else { // if null has been provided as salt parameter create a new random salt. saltBytes = new byte[64]; SecureRandom secureRandom = new SecureRandom(); secureRandom.nextBytes(saltBytes); } // MessageDigest converts our password and salt into a hash. MessageDigest messageDigest = MessageDigest.getInstance(hashAlgorithm); // concatenate the salt byte[] and the password byte[]. byte[] saltAndPassword = concatArrays(saltBytes, passwordBytes); // create the hash from our concatenated byte[]. byte[] saltedHash = messageDigest.digest(saltAndPassword); // get java''s base64 encoder for encoding. Encoder base64Encoder = Base64.getEncoder(); // create a StringBuilder to build the result. StringBuilder result = new StringBuilder(); result.append(base64Encoder.encodeToString(saltBytes)) // base64-encode the salt and append it. .append(delimiter) // append the delimiter (watch out! don''t use regex expressions as delimiter if you plan to use String.split() to isolate the salt!) .append(base64Encoder.encodeToString(saltedHash)); // base64-encode the salted hash and append it. // return a salt and salted hash combo. return result.toString(); } public static byte[] concatArrays(byte[]... arrays) { int concatLength = 0; // get the actual length of all arrays and add it so we know how long our concatenated array has to be. for(int i = 0; i< arrays.length; i++) { concatLength = concatLength + arrays[i].length; } // prepare our concatenated array which we''re going to return later. byte[] concatArray = new byte[concatLength]; // this index tells us where we write into our array. int index = 0; // concatenate the arrays. for(int i = 0; i < arrays.length; i++) { for(int j = 0; j < arrays[i].length; j++) { concatArray[index] = arrays[i][j]; index++; } } // return the concatenated arrays. return concatArray; }


import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.commons.codec.binary.Hex; public String getHashSHA512(String StringToHash, String salt){ String generatedPassword = null; try { MessageDigest md = MessageDigest.getInstance("SHA-512"); md.update(salt.getBytes(StandardCharsets.UTF_8)); byte[] bytes = md.digest(StringToHash.getBytes(StandardCharsets.UTF_8)); generatedPassword = Hex.encodeHexString(bytes); } catch (NoSuchAlgorithmException e){ e.printStackTrace(); } return generatedPassword; }

No se recomienda usar funciones hash para contraseñas, ya que existen nuevos algoritmos como bcrypt o scrypt.