sql >> Base de Datos >  >> RDS >> Oracle

Oracle 12c IDENTIFICADO POR VALORES

Desde que puedo recordar en mi carrera trabajando con Oracle, he podido modificar la contraseña de un usuario al hash de contraseña. El truco que a veces empleé fue almacenar el hash de ID de usuario/contraseña, cambiar la contraseña a algo que conozco, conectarme a la base de datos como ese usuario y luego hacer mi trabajo. Cuando termine con mi trabajo, vuelva a establecer la contraseña en lo que sea que sea similar a lo siguiente:

ALTERAR USUARIO bob IDENTIFICADO POR VALORES 'asdf1234%^&*qwerty';

Nunca necesité saber la contraseña del usuario para volver a configurarla, siempre y cuando supiera que era el valor hash. Ayer encontré información en la que las personas recibían el siguiente error al intentar establecer una contraseña de esta manera en 12c:

ORA-02153:cadena de contraseña de VALORES no válida

Si busca este error en My Oracle Support, lo más probable es que llegue a la Nota 2096579.1. En esa nota, se afirma que este método ya no es posible. Dice "Esta es una nueva funcionalidad en 12c para obligar a los usuarios a crearse de la manera correcta". Pero he descubierto que esto no es exactamente cierto.

Oracle 12c introdujo una nueva funcionalidad para hacer que los valores hash de ID de usuario/contraseña sean más seguros. Aquí hay un enlace a la Guía de seguridad 12c donde habla sobre el Verificador 12c para contraseñas. Tenga en cuenta que en esa sección, menciona un valor de sal agregado a la contraseña cuando se codifica. Para ver por qué esto es importante, veamos un ejemplo. Crearé un usuario y miraré el hash de ID de usuario/contraseña almacenado en la columna SPARE4 de SYS.USER$.

SQL> create user bob identified by abc123;
User created.
SQL> grant create session to bob;
Grant succeeded.
SQL> select spare4 from sys.user$ where name='BOB';
SPARE4
--------------------------------------------------------------------------------
S:44F34BA1369D58A6CB262D166587D5238D9148FC9BDD390A98C29A3B6A34;H:FD30F9DA6ECB907
6C10C04D20AFF9492;T:450FF7F2A4BB8104E33E7C09FF1698AEA2DE3EBD60BFA681942057D83EE2
DD773BB4F7B1046355D1CB63EBF256BC7B466BB1B3185A0988D1CBAE3276D1B181756DB27BB40505
8C44152DB2DD41074396

En versiones anteriores, la columna SPARE4 no contendría tantos caracteres. Esto es definitivamente más complejo que las versiones anteriores a 12c. Mi suposición, aunque no confirmada, es que la parte S:de la salida anterior es el valor de sal. No estoy seguro de qué representan H:y T:.

Podemos usar el paquete DBMS_METADATA para aplicar ingeniería inversa a un usuario. Cuando hacemos eso, podemos ver que aún podemos usar la cláusula IDENTIFIED BY VALUES.

SQL> select dbms_metadata.get_ddl('USER','BOB') from dual;
DBMS_METADATA.GET_DDL('USER','BOB')
--------------------------------------------------------------------------------
CREATE USER "BOB" IDENTIFIED BY VALUES 'S:44F34BA1369D58A6CB262D166587D5238D9
148FC9BDD390A98C29A3B6A34;H:FD30F9DA6ECB9076C10C04D20AFF9492;T:450FF7F2A4BB8104E
33E7C09FF1698AEA2DE3EBD60BFA681942057D83EE2DD773BB4F7B1046355D1CB63EBF256BC7B466
BB1B3185A0988D1CBAE3276D1B181756DB27BB405058C44152DB2DD41074396;5844087A3D506FD3
'
 DEFAULT TABLESPACE "USERS"
 TEMPORARY TABLESPACE "TEMP"

Y de hecho, eso funciona. Cambiaré la contraseña de BOB a algo diferente, luego la cambiaré a este valor hash y me conectaré con la contraseña anterior.

SQL> alter user bob identified by newpass;
User altered.
SQL> alter user bob identified by values 'S:44F34BA1369D58A6CB262D166587D5238D9148FC9BDD390A98C29A3B6A34;H:FD30F9DA6ECB9076C10C04D20AFF9492;T:450FF7F2A4BB8104E33E7C09FF1698AEA2DE3EBD60BFA681942057D83EE2DD773BB4F7B1046355D1CB63EBF256BC7B466BB1B3185A0988D1CBAE3276D1B181756DB27BB405058C44152DB2DD41074396;5844087A3D506FD3';
User altered.
SQL> connect bob/abc123
Connected.

Por lo tanto, no hemos perdido ninguna funcionalidad como implica la nota MOS. Solo tenemos que lidiar con un valor hash mucho más largo aquí.

Donde esto se vuelve realmente importante es cuando se intenta usar exp/imp o Data Pump para mover a los usuarios de una versión anterior a 12c a 12c. Si realiza una exportación COMPLETA de una base de datos Oracle 11g, el volcado contendrá los valores hash de la contraseña anterior. Al importar a 12c, es cuando recibirá el error ORA-02153. Para solucionar este problema, cree previamente los usuarios en la base de datos 12c con contraseñas conocidas.