Estás confundiendo dos problemas ligeramente ortogonales aquí con la frase "comparar contraseñas con hash"
Almacenamiento de la contraseña (antes del hashing)
Como dice Jon Skeet en SO:
Las cadenas son inmutables (en Java y muchos otros lenguajes GC). Eso significa que una vez que haya creado la Cadena, si otro proceso puede volcar la memoria, no hay forma (aparte de la reflexión) que pueda deshacerse de los datos antes de que comience la recolección de basura.
Si está manejando la contraseña de un usuario, desea protegerse contra este riesgo, por lo tanto, utiliza un tipo de datos que puede sobrescribir inmediatamente una vez que lo haya usado; una matriz de bytes se ajusta perfectamente a la factura. Una vez que haya aplicado el algoritmo de hash de su contraseña, puede rellenar con cero la matriz (o utilizar datos aleatorios, o lo que sea).
Comparando los hashes (es decir, después del hashing, antes de iniciar sesión)
Bytes de salida de funciones hash. Es cómo se definen y, típicamente, cómo funcionan en la mayoría de los lenguajes de programación, por lo tanto, tiene más sentido simplemente comparar los dos bytestrings tal como son, sin ejecutarlos primero a través de ningún convertidor.
Sin embargo, si el hash de su contraseña está codificado en base64 en su base de datos, no hay pérdida de seguridad al tomar el hash de contraseña calculado y codificarlo en base64 y luego comparar cadenas. El hash ya está en su base de datos: si un atacante tiene acceso a su sistema suficiente para volcar la memoria del proceso, no debería ser muy difícil recuperar el hash de la contraseña de su base de datos, realmente no importa si lo eliminan. allí o desde una copia inmutable guardada hasta que su GC se ejecute.
Summary
Así que para mantener las cosas simples:
- Procese las contraseñas de los usuarios como matrices de bytes, sin utilizar tipos de cadena.
- Los hashes de proceso también como cadenas de bytes, ya que no hay ningún beneficio en convertirlos solo para comparar.
- Utilice un esquema de hashing de contraseña seguro. Argon2, si está disponible actualmente, se recomienda, de lo contrario, siga los consejos aquí: enlace