Oui, cela est pris en charge depuis Oracle 9i, lorsqu'une fonction a été introduite pour vérifier la complexité d'un nouveau mot de passe et, éventuellement, la différence avec l'ancien mot de passe. Comme Oracle ne stocke que les hachages, et non les mots de passe, il ne peut pas comparer l'ancien et le nouveau mot de passe à moins que l'utilisateur ne le fournisse pendant le changement.
Ainsi, tous les utilisateurs ayant un PROFILE
où le PASSWORD_VERIFY_FUNCTION
est défini sont tenus d'avoir l'ancien mot de passe, même si cette fonction ne vérifie aucun mot de passe :
CREATE OR REPLACE FUNCTION always_true (
username VARCHAR2,
password VARCHAR2,
old_password VARCHAR2) RETURN boolean IS
BEGIN
RETURN TRUE;
END always_true;
/
CREATE PROFILE always_true
LIMIT PASSWORD_VERIFY_FUNCTION always_true;
CREATE USER user_a IDENTIFIED BY secret123 PROFILE always_true;
GRANT CREATE SESSION to user_a;
Maintenant user_a
doit spécifier l'ancien mot de passe :
ALTER USER user_a IDENTIFIED BY secret123;
ORA-28221: REPLACE not specified
ALTER USER user_a IDENTIFIED BY secret456 REPLACE secret123;
User altered.
Un utilisateur avec un profil sans PASSWORD_VERIFY_FUNCTION
ou ce paramètre réglé sur NULL
n'a pas besoin de spécifier l'ancien mot de passe :
CREATE PROFILE without_function
LIMIT PASSWORD_VERIFY_FUNCTION NULL;
CREATE USER user_b IDENTIFIED BY secret123 PROFILE without_function;
GRANT CREATE SESSION to user_b;
Maintenant user_b
peut changer son mot de passe sans avoir l'ancien mot de passe :
ALTER USER user_b IDENTIFIED BY secret789;
User altered.
La deuxième option est d'avoir le privilège ALTER USER
mais ce n'est que pour les administrateurs, car ils peuvent changer tous les mots de passe de tous les comptes.