jueves, 28 de agosto de 2008

Passwords en Oracle

Desde hace mucho tiempo, se conoce la forma en que el hash de oracle se calcula para las versiones menores a 11g. E incluso se conoce el algoritmo del cálculo del hash para 11g.

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.

1 comentario:

Anónimo dijo...

tengo este error al momento de levantar oracle 10g:

$ ./oracle start
Contraseña:

SQL*Plus: Release 10.1.0.2.0 - Production on Mar Mar 2 14:14:10 2010

Copyright (c) 1982, 2004, Oracle. All rights reserved.

SQL> ERROR:
ORA-12162: TNS:el nombre de servicio de red no se ha especificado correctamente


SQL> ORA-12162: TNS:el nombre de servicio de red no se ha especificado correctamente
SQL>
Database "" warm started.

puedes ayudarme???