Java: generar una sal aleatoria no es aleatorio
Estoy tratando de generar una sal en Java para usar con un algoritmo de hash para el almacenamiento seguro de contraseñas. Estoy usando el siguiente código para crear la sal aleatoria:
private static String getSalt() throws NoSuchAlgorithmException {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[16];
sr.nextBytes(salt);
System.out.println(salt.toString());
return salt.toString();
}
Lo que debería generar una sal completamente segura, generada aleatoriamente para usar en mi algoritmo de hashing. Sin embargo, cuando ejecuto el código, sigue produciendo la misma sal cada vez ... Indicando que la sal que se genera no es aleatoria en absoluto.
Por razones de seguridad obvias, cada usuario necesita una sal única; sin embargo, si uso este código cada vez que se crea una nueva cuenta, cada usuario tendrá la misma sal, lo que anulará el propósito de tenerla en primer lugar.
Mi pregunta es esta: ¿por qué esto me sigue dando la misma sal y qué puedo hacer para asegurarme de que la sal generada sea completamente aleatoria cada vez que se ejecuta el código?
EDITAR:
Pensé que incluiría el código fuente de todo el programa de hashing que ahora se ha solucionado y funciona correctamente. Este es un prototipo simple para simular la generación del hash al crear la cuenta y luego verificar la contraseña al iniciar sesión en el sistema.
package hashingwstest;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;
import java.util.Scanner;
public class HashingWSTest {
public static void main(String[] args) throws NoSuchAlgorithmException {
Scanner sc = new Scanner(System.in);
System.out.print("Enter Password: ");
String passwordToHash = sc.nextLine();
byte[] bytes = getBytes();
String salt = new String(bytes);
String securePassword = hash256(passwordToHash, salt);
System.out.println("Hash successfully generated");
System.out.print("Enter your password again: ");
String checkPassword = sc.nextLine();
String checkHash = hash256(checkPassword,salt);
if (checkHash.equals(securePassword)) {
System.out.println("MATCH");
}
else {
System.out.println("NO MATCH");
}
}
private static String hash256(String passwordToHash, String salt) {
String generatedPassword = null;
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt.getBytes());
byte[] bytes = md.digest(passwordToHash.getBytes());
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;
}
private static byte[] getBytes() throws NoSuchAlgorithmException {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
byte[] bytes = new byte[16];
sr.nextBytes(bytes);
return bytes;
}
}