Lo que es importante notar es que con el poder de cómputo de estos días, y con la debilidad del password de oracle, si no usamos passwords difíciles de crackear, podemos tener un riesgo de seguridad muy grande.
A continuación expongo un script, sólo con fines ilustrativos, la forma en que oracle calcula el hash
hashoracle.pl
use warnings;
use strict;
use Crypt::CBC;
use Encode;
use Unicode::String qw(utf8 latin1 utf16);
my $llave = pack("H16", "0123456789ABCDEF");
my $usuario = 'Hugo';
my $password = 'abc123';
my $textoplano = uc($usuario.$password);
my $utf16 =utf8($textoplano);
my $octeto = $utf16->utf16;
my $IV = pack("H16", "0000000000000000");
my $cifrado = Crypt::CBC->new(
-key => $llave,
-cipher => 'DES',
-iv => $IV,
-header => 'none',
-padding => 'null',
-literal_key=>1,
);
my $textocifrado = $cifrado->encrypt($octeto);
my $cifrado1 = Crypt::CBC->new(
-key => substr($textocifrado, length($textocifrado)-8,8),
-cipher => 'DES',
-iv => $IV,
-header => 'none',
-padding => 'null',
-literal_key=>1,
);
my $textocifrado1 = $cifrado1->encrypt($octeto);
my( $hex1 ) = unpack( 'H*', $textocifrado1 );
my $temp1 = uc(substr($hex1,length($hex1)-16,16));
print "\n$temp1\n";
__END__
Si este script se pusiera en un ciclo infinito a buscar passwords para hacer un match contra un hash preestablecido, podría buscar aproximadamente 800,000 hashes por segundo, si este mismo script se pasara a C, podría buscar aproximadamente 1,300,000 hashes por segundo. Alex Kornbust tiene un programa que incluso puede hacer uso de threads en los CPUs y genera hasta 2,400,000 por segundo.
Así que pensemos que, de acuerdo a estudios realizados, un password de 8 caracteres, puede ser descubierto en tan sólo 20 días, de 9 caracteres, ya puede pasar del año, pero teniendo 40 computadoras descifrando passwords, el tiempo vuelve a 20 días, así que ¿cuál es mi recomendación?
Seguir de lleno las recomendaciones de Oracle:
- Crea los passwords entre 8 y 30 caracteres (yo recomendaría de 10 a 30 caracteres).
- Utiliza símbolos del Character Set para definir los passwords (#$_).
- Además de incluir un dígito y un alfanumérico, también incluye un signo de puntuación.
- No inicies un password con un número.
- No utilices palabras reservadas de oracle.
- No uses palabras de diccionario.
Adicionalmente podemos crear passwords más complejos, pero esto también nos limita el uso un poco:
Empecemos con passwords entre comillas
C:\>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 11:56:39 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> alter user hugo identified by "de la sierra morena cielito";
Usuario modificado.
SQL> conn hugo/"de la sierra morena cielito";
Conectado.
En este punto tenemos un pequeño problema, o quizás sólo yo, pero no he podido pasar a nivel sistema operativo mi password, es decir, la conexión la debo de realizar con /nolog, o bien usando únicamente el usuario y esperar a que sqlplus nos pregunte el password.
C:\>sqlplus hugo/"de\ la\ sierra\ morena\ cielito"
SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:00:23 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
C:\>sqlplus hugo
SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:01:43 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Introduzca la contraseña:
Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>
C:\>sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:02:43 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn hugo/"de la sierra morena cielito";
Conectado.
Algo de lo que podemos hacer uso, como bien nos recomienda oracle, es el uso de caracteres especiales, por ejemplo:
C:\>set NLS_LANG=spanish_america.we8pc850
C:\>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:05:04 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> alter user hugo identified by querétaro;
Usuario modificado.
Al hacer esto, nos aseguramos que los passwords sólo funcionan con nuestro caracter set o alguno muy similar:
C:\>set NLS_LANG=spanish_america.we8iso8859p1
C:\>sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:08:18 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn hugo/querétaro
ERROR:
ORA-01017: invalid username/password; logon denied
SQL> exit
C:\>set NLS_LANG=spanish_america.utf8
C:\>sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:09:14 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn hugo/querétaro
ERROR:
ORA-01017: invalid username/password; logon denied
SQL> exit
C:\>set NLS_LANG=spanish_america.we8pc850
C:\>sqlplus /nolog
SQL*Plus: Release 10.2.0.3.0 - Production on Jue Ago 28 12:09:37 2008
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
SQL> conn hugo/querétaro
Conectado.
De esta forma podemos asegurar más nuestros passwords y asegurar de una mejor forma nuestra base de datos.