Creé un reino personalizado usando Apache Shiro para dar cuenta de que nuestra aplicación tiene más de una ubicación para las cuentas de usuario y las contraseñas almacenadas. Originalmente estaba usando Shiro para codificar y hacer coincidir las contraseñas, pero el reino personalizado significa que tengo que hacer algunas de estas cosas manualmente.
Después de buscar me encontré con este código:
public String sha256(String base) { try{ MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(base.getBytes("UTF-8")); StringBuffer hexString = new StringBuffer(); for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(0xff & hash[i]); if(hex.length() == 1) hexString.append('0'); hexString.append(hex); } return hexString.toString(); } catch(Exception ex){ throw new RuntimeException(ex); } }Agregué una sal y funciona muy bien, así que me pregunto si puedo almacenar el valor devuelto en una base de datos al crear un par de nombre de usuario\contraseña y luego recuperarlo para que coincida con la contraseña proporcionada (más la sal). Parece que debería funcionar, pero cuando hice esto anteriormente con Shiro, el hasher de contraseña SHA256 NO devolvió el mismo valor con la misma contraseña base cada vez, pero siempre fue capaz de hacerlo coincidir. Quería asegurarme de seguir una metodología válida (y, lo que es más importante, segura) para el manejo de contraseñas.
Un par de cosas: puede crear un hash de una cadena de compra usando algo como: new Sha256Hash(password, salt)
Echa un vistazo a este ejemplo
Si tiene varios lugares donde se almacenan los usuarios, probablemente debería tener un reino diferente para cada tienda.