Actualizar estrategia hash

Considere el aspecto del mecanismo de actualización del hash. Supongamos que originalmente se aplicó un cifrado hash a la contraseña con MD5 y que el algoritmo se actualizó varias veces con Argon 2ID13. El diagrama siguiente muestra el flujo de actualización hash.

Flujo de trabajo de actualización de hash

Cada algoritmo hash utiliza el hash de contraseña anterior para generar un nuevo hash. Commerce no almacena la contraseña original sin procesar.

Estrategia de actualización de hash

Como se ha mencionado anteriormente, el hash de contraseña puede tener varias versiones hash aplicadas a la contraseña original.
Así es como funciona el mecanismo de verificación de contraseña durante la autenticación de un cliente.

def verify(password, hash):
    restored = password

    hash_map = extract(hash)
    # iterate through all versions specified in the received hash [md5, sha256, argon2id13]
    for version in hash_map.get_versions():
        # generate new hash based on password/previous hash, salt and version
        restored = hash_func(salt . restored, version)

    # extract only password hash from the hash:salt:version chain
    hash = hash_map.get_hash()

    return compare(restored, hash)

Dado que Commerce almacena todas las versiones de hash de contraseña utilizadas junto con el hash de contraseña, podemos restaurar toda la cadena de hash durante la verificación de la contraseña. El mecanismo de verificación de hash es similar a la estrategia de actualización de hash: en función de las versiones almacenadas junto con el hash de contraseña, el algoritmo genera hash a partir de la contraseña proporcionada y devuelve el resultado de comparación entre la contraseña con hash y el hash almacenado en la base de datos.