miércoles, 29 de abril de 2026

El caso de la longitud de las contraseñas en Oracle AI Database 26ai: “Toda verdad técnica expresada sin contexto tiende a parecer absoluta; al añadir sus condiciones, se revela relativa dentro de un sistema.”

 

En Oracle Database un VARCHAR2(4000) puede almacenar hasta 4000 bytes o hasta 4000 caracteres, dependiendo de cómo fue definida la columna y del parámetro NLS_LENGTH_SEMANTICS.

Pero lo que si estamos casi de acuerdo, es que serían un poco más o menos de 4000 bytes. Esto es una verdad absoluta que no permite discusión, cierto? Pues no.

Filosóficamente, podrías usar este caso para ilustrar la diferencia entre verdad absoluta, verdad formal y verdad contextual.

La afirmación dogmática sería:
“Un campo VARCHAR2(4000) almacena 4000.”

Presentada así, parece una verdad absoluta, casi axiomática. Pero en realidad es una proposición incompleta, porque omite la naturaleza de la unidad medida.

La verdad formal en Oracle sería: “Un VARCHAR2(4000) almacena hasta 4000 unidades de longitud definidas como BYTE o CHAR.”

Y la verdad contextual añade: “En un charset multibyte, 4000 caracteres pueden requerir muchos más bytes; por tanto, la capacidad efectiva en caracteres puede reducirse incluso a una cuarta parte.”

Ejemplo con AL32UTF8 y caracteres de 4 bytes (como muchos emojis): límite declarado: 4000 bytes
cada carácter consume 4 bytes, por tanto la capacidad real: 4000/4=10004000 / 4 = 10004000/4=1000, es decir, solo una cuarta parte de “caracteres” respecto a ASCII.

Desde la filosofía del lenguaje, esto recuerda a Ludwig Wittgenstein:

el significado depende del “juego del lenguaje”

“4000” no significa nada por sí mismo si no se especifica si hablamos de bytes o caracteres.

Desde Aristóteles, sería un problema de sustancia y accidente:
  • sustancia: la columna tiene límite 4000.
  • accidente: cómo se representa cada símbolo.
Desde Immanuel Kant, el “4000” sería el fenómeno percibido; la “cosa en sí” está condicionada por el charset.

Y desde una crítica al absolutismo epistemológico:

“Toda verdad técnica expresada sin contexto tiende a parecer absoluta; al añadir sus condiciones, se revela relativa dentro de un sistema.”

En la base de datos de Oracle AI Database 26ai,

SQL> select BANNER_FULL from v$version;

BANNER_FULL
--------------------------------------------------------------------------------
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0

SQL>
 
Existen 15 tablas con el nombre de la columna "PASSWORD".
  

SQL> select count(*) from dba_tab_columns
  2  where column_name='PASSWORD';

  COUNT(*)
----------
        15

Dos de los objetos más relevantes en donde se encuentra la columna "PASSWORD", si haz seguido mis lecturas durante estos años, son SYS.USER$ y DBA_USERS. En ambos objetos, el valor de precisión para la columna "PASSWORD" es de 4000 BYTES. Recuerden que ya para el set de caracteres que utilizamos normalmente en Latinoamérica las bases de datos modernas hacen una conversión de caracters a bytes.


SQL> desc sys.USER$
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 USER#                                     NOT NULL NUMBER
 NAME                                      NOT NULL VARCHAR2(128)
 TYPE#                                     NOT NULL NUMBER
 PASSWORD                                           VARCHAR2(4000)
 DATATS#                                   NOT NULL NUMBER
 TEMPTS#                                   NOT NULL NUMBER
 CTIME                                     NOT NULL DATE
 PTIME                                              DATE
 EXPTIME                                            DATE
 LTIME                                              DATE
 RESOURCE$                                 NOT NULL NUMBER
 AUDIT$                                             VARCHAR2(38)
 DEFROLE                                   NOT NULL NUMBER
 DEFGRP#                                            NUMBER
 DEFGRP_SEQ#                                        NUMBER
 ASTATUS                                   NOT NULL NUMBER
 LCOUNT                                    NOT NULL NUMBER
 DEFSCHCLASS                                        VARCHAR2(128)
 EXT_USERNAME                                       VARCHAR2(4000)
 SPARE1                                             NUMBER
 SPARE2                                             NUMBER
 SPARE3                                             NUMBER
 SPARE4                                             VARCHAR2(1000)
 SPARE5                                             VARCHAR2(1000)
 SPARE6                                             DATE
 SPARE7                                             VARCHAR2(4000)
 SPARE8                                             VARCHAR2(4000)
 SPARE9                                             NUMBER
 SPARE10                                            NUMBER
 SPARE11                                            TIMESTAMP(6)
 SPARE12                                            NUMBER
 SPARE13                                            NUMBER
 SPARE14                                            NUMBER
 SPARE15                                            DATE
 SPARE16                                            VARCHAR2(4000)

SQL> desc sys.DBA_USERS
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 USERNAME                                  NOT NULL VARCHAR2(128)
 USER_ID                                   NOT NULL NUMBER
 PASSWORD                                           VARCHAR2(4000)
 ACCOUNT_STATUS                            NOT NULL VARCHAR2(32)
 LOCK_DATE                                          DATE
 EXPIRY_DATE                                        DATE
 DEFAULT_TABLESPACE                        NOT NULL VARCHAR2(30)
 TEMPORARY_TABLESPACE                      NOT NULL VARCHAR2(30)
 LOCAL_TEMP_TABLESPACE                              VARCHAR2(30)
 CREATED                                   NOT NULL DATE
 PROFILE                                   NOT NULL VARCHAR2(128)
 INITIAL_RSRC_CONSUMER_GROUP                        VARCHAR2(128)
 EXTERNAL_NAME                                      VARCHAR2(4000)
 PASSWORD_VERSIONS                                  VARCHAR2(17)
 EDITIONS_ENABLED                                   VARCHAR2(1)
 AUTHENTICATION_TYPE                                VARCHAR2(8)
 PROXY_ONLY_CONNECT                                 VARCHAR2(1)
 COMMON                                             VARCHAR2(3)
 LAST_LOGIN                                         TIMESTAMP(9) WITH TIME ZONE
 ORACLE_MAINTAINED                                  VARCHAR2(1)
 INHERITED                                          VARCHAR2(3)
 DEFAULT_COLLATION                                  VARCHAR2(100)
 IMPLICIT                                           VARCHAR2(3)
 ALL_SHARD                                          VARCHAR2(3)
 EXTERNAL_SHARD                                     VARCHAR2(3)
 PASSWORD_CHANGE_DATE                               DATE
 MANDATORY_PROFILE_VIOLATION                        VARCHAR2(3)
 PROTECTED                                          VARCHAR2(3)
 READ_ONLY                                          VARCHAR2(3)
 DICTIONARY_PROTECTED                               VARCHAR2(3)
 CLOUD_MAINTAINED                                   VARCHAR2(3)
 APPLICATION                                        VARCHAR2(3)
 MFA                                                VARCHAR2(9)

SQL>

Pero si revisamos la documentación oficial en Oracle.com, en Oracle AI Database 26ai, la longitud máxima del password es de 1024 bytes.

La columna esta definida para un tamaño más grande, pero sólo se pueden crear contraseñas con el tamaño máximo de 1024 bytes.

Veamos un ejemplo:

SQL> alter user seguro_seguro identified by EsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoS;

User altered.


SQL> alter user seguro_seguro identified by EsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSuper;
alter user seguro_seguro identified by EsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSuper
                                       *
ERROR at line 1:
ORA-28218: password length more than 1024 bytes
Help: https://docs.oracle.com/error-help/db/ora-28218/

Ven porque toda la explicación "innecesaria" que hice al puro principio de la publicación.?

“Toda verdad técnica expresada sin contexto tiende a parecer absoluta; al añadir sus condiciones, se revela relativa dentro de un sistema.”


No hay comentarios:

Publicar un comentario

Te agradezco tus comentarios. Te esperamos de vuelta.

Todos los Sábados a las 8:00PM