Noticias Weblogs Foros Wiki Código
Sponsors:

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Anunciarse aquí

PlanetaCódigo en inglés

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

PHP Senior

“Petición para soporte de Name Spaces en PHP5″

Abril 30th, 2006 - [Enlace local]

Este tema lo comenté por primera vez cuando escribí sobre cómo se representaría una arquitectura de 3 capas en PHP5. Ahora me entero que era más grave de lo que yo pensaba ;-)

Noticia extraida de VivaPHP:
"Petición para soporte de Name Spaces en PHP5 (07.04.2006)

PHP¿Hasta dónde pueden llegar los programadores de PHP en su súplica para que los desarrolladores de Zend vean la luz y agreguen de una soporte de name spaces a este lenguaje? Pues hasta el punto de organizar una petición on-line para implorar que por lo menos incluyan el parche de Jessie Hernandez en la próxima versión de PHP5.

El soporte de name spaces está en seria consideración para PHP6, con una álgida discusión en la lista de correo de php-internals sobre la mejor forma de implementar esta retrasadísima característica."

Antes que saliera la versión final de PHP5 leí la documentación sobre lo nuevo que incorporaba y se hacía referencia constante al concepto de "namespace". Al principio me sorprendió porque PHP5 se basa mucho en la sintaxis que usa Java para implementar los objetos y este usa la sintaxis "package" y solo en .Net se usaba "namespace".

La mayor sorpresa fue que cuando se liberó la versión final de PHP5, este no soportaba los "namespaces" (a pesar de haberlos probado en la beta).

Volviendo al tema, para ubicarnos un poco en el contexto, este tipo de sintaxis nos permite representar el concepto de diseño llamado "arquitectura en capas" o directamente "programación en tres capas" (pueden haber muchas más capas, pero generalmente se habla de que deberían existir por lo menos tres), donde deberíamos separar claramente las distintas responsabilidades básicas de nuestros sistemas.

La primer capa, la presentación, sería la encargada de manejar nuestra "interfaz" con los usuarios (pantallas gráficas, páginas web, etc), la segunda capa, el dominio o lógica, donde deberemos alojar el código que resuelve concretamente la problemática de nuestro sistema, y por último la tercer capa, la persistencia, que tendrá la responsabilidad de "persistir" la información, tanto almacenarla en una base de datos o en un archivo de texto (o en cualquier otro medio), para luego poder recuperarla cuando lo requiera nuestro sistema.

La idea de la "arquitectura orientada a capas" es que tenemos separadas de forma clara las responsabilidades, desacoplando nuestro código.

Si no tuviéramos capas, que es lo mismo que decir que tenemos una sola capa, nuestro código tendría entreveradas todas las responsabilidades. Cualquier cambio que se quiera hacer al código que implementa la interfaz afectaría a todo el resto del código. Si necesitáramos cambiar de interfaz (pasar de un sistema de escritorio de ventanas a un sistema web) deberíamos modificar todas las llamadas en nuestro código que cumplen esa tarea. Pero si tenemos "capas", podemos crear un nuevo "paquete" y sustituirlo por el anterior, y nuestro sistema debería poder seguir funcionando sin problemas. Sería exactamente el mismo caso si tuviéramos que cambiar de motor de bases de datos, solo deberíamos poder cambiar de "capa" y nuestro sistema seguir operativo (o por lo menos, las modificaciones solo afectarían un paquete, no al resto).

En UML cada capa representa un "paquete" (o viceversa), y estos contienen en su interior clases u otros paquetes, y en muchos lenguajes (como Java) esto se traduce físicamente en un directorio.

La idea es que si nuestro Gerente nos entrega el diagrama UML, nosotros deberíamos poder interpretar el diagrama y representarlo en código en alguno de los lenguajes disponibles que cumplan con la Orientación a Objetos.

La desventaja que tiene PHP, al no soportar los namespace, es que no podemos cumplir fielmente los diagramas UML al tener que incluir individualmente los archivos que vamos necesitando, cuando deberíamos poder hacer referencia directa a un "paquete" como una "unidad".

No es lo mismo decir en nuestro código:

namespace dominio;
namespace persistencia;

Que tener que hacer referencia a cada uno de los archivos que vamos a utilizar de nuestro "paquete":

require_once 'persistencia/BaseDeDatos.class.php';
require_once 'dominio/Clientes.class.php';
require_once 'dominio/Acreedores.class.php';
require_once 'dominio/Factura.class.php';
require_once 'dominio/LineaFactura.class.php';


Lo más grave de todo es que nos debilita el diseño al no permitirnos cumplir con lo básico de los "principios del diseño orientado a objetos". Nosotros deberíamos reusar "paquetes" y no partes concretas de esos paquetes (en este caso, serían las clases).

Esperemos que se implemente en PHP6 y demos un nuevo gran paso.

» Leer más, comentarios, etc...

PHP Senior

“Petición para soporte de Name Spaces en PHP5″

Abril 30th, 2006 - [Enlace local]

Este tema lo comenté por primera vez cuando escribí sobre cómo se representaría una arquitectura de 3 capas en PHP5. Ahora me entero que era más grave de lo que yo pensaba ;-)

Noticia extraida de VivaPHP:

"Petición para soporte de Name Spaces en PHP5 (07.04.2006)

PHP¿Hasta dónde pueden llegar los programadores de PHP en su súplica para que los desarrolladores de Zend vean la luz y agreguen de una soporte de name spaces a este lenguaje? Pues hasta el punto de organizar una petición on-line para implorar que por lo menos incluyan el parche de Jessie Hernandez en la próxima versión de PHP5.

El soporte de name spaces está en seria consideración para PHP6, con una álgida discusión en la lista de correo de php-internals sobre la mejor forma de implementar esta retrasadísima característica."

Antes que saliera la versión final de PHP5 leí la documentación sobre lo nuevo que incorporaba y se hacía referencia constante al concepto de "namespace". Al principio me sorprendió porque PHP5 se basa mucho en la sintaxis que usa Java para implementar los objetos y este usa la sintaxis "package" y solo en .Net se usaba "namespace".

La mayor sorpresa fue que cuando se liberó la versión final de PHP5, este no soportaba los "namespaces" (a pesar de haberlos probado en la beta).

Volviendo al tema, para ubicarnos un poco en el contexto, este tipo de sintaxis nos permite representar el concepto de diseño llamado "arquitectura en capas" o directamente "programación en tres capas" (pueden haber muchas más capas, pero generalmente se habla de que deberían existir por lo menos tres), donde deberíamos separar claramente las distintas responsabilidades básicas de nuestros sistemas.

La primer capa, la presentación, sería la encargada de manejar nuestra "interfaz" con los usuarios (pantallas gráficas, páginas web, etc), la segunda capa, el dominio o lógica, donde deberemos alojar el código que resuelve concretamente la problemática de nuestro sistema, y por último la tercer capa, la persistencia, que tendrá la responsabilidad de "persistir" la información, tanto almacenarla en una base de datos o en un archivo de texto (o en cualquier otro medio), para luego poder recuperarla cuando lo requiera nuestro sistema.

La idea de la "arquitectura orientada a capas" es que tenemos separadas de forma clara las responsabilidades, desacoplando nuestro código.

Si no tuviéramos capas, que es lo mismo que decir que tenemos una sola capa, nuestro código tendría entreveradas todas las responsabilidades. Cualquier cambio que se quiera hacer al código que implementa la interfaz afectaría a todo el resto del código. Si necesitáramos cambiar de interfaz (pasar de un sistema de escritorio de ventanas a un sistema web) deberíamos modificar todas las llamadas en nuestro código que cumplen esa tarea. Pero si tenemos "capas", podemos crear un nuevo "paquete" y sustituirlo por el anterior, y nuestro sistema debería poder seguir funcionando sin problemas. Sería exactamente el mismo caso si tuviéramos que cambiar de motor de bases de datos, solo deberíamos poder cambiar de "capa" y nuestro sistema seguir operativo (o por lo menos, las modificaciones solo afectarían un paquete, no al resto).

En UML cada capa representa un "paquete" (o viceversa), y estos contienen en su interior clases u otros paquetes, y en muchos lenguajes (como Java) esto se traduce físicamente en un directorio.

La idea es que si nuestro Gerente nos entrega el diagrama UML, nosotros deberíamos poder interpretar el diagrama y representarlo en código en alguno de los lenguajes disponibles que cumplan con la Orientación a Objetos.

La desventaja que tiene PHP, al no soportar los namespace, es que no podemos cumplir fielmente los diagramas UML al tener que incluir individualmente los archivos que vamos necesitando, cuando deberíamos poder hacer referencia directa a un "paquete" como una "unidad".

No es lo mismo decir en nuestro código:

namespace dominio;
namespace persistencia;

Que tener que hacer referencia a cada uno de los archivos que vamos a utilizar de nuestro "paquete":

require_once 'persistencia/BaseDeDatos.class.php';
require_once 'dominio/Clientes.class.php';
require_once 'dominio/Acreedores.class.php';
require_once 'dominio/Factura.class.php';
require_once 'dominio/LineaFactura.class.php';


Lo más grave de todo es que nos debilita el diseño al no permitirnos cumplir con lo básico de los "principios del diseño orientado a objetos". Nosotros deberíamos reusar "paquetes" y no partes concretas de esos paquetes (en este caso, serían las clases).

Esperemos que se implemente en PHP6 y demos un nuevo gran paso.

» Leer más, comentarios, etc...

PHP Senior

“Petición para soporte de Name Spaces en PHP5″

Abril 30th, 2006 - [Enlace local]

Este tema lo comenté por primera vez cuando escribí sobre cómo se representaría una arquitectura de 3 capas en PHP5. Ahora me entero que era más grave de lo que yo pensaba ;-)

Noticia extraida de VivaPHP:

"Petición para soporte de Name Spaces en PHP5 (07.04.2006)

PHP¿Hasta dónde pueden llegar los programadores de PHP en su súplica para que los desarrolladores de Zend vean la luz y agreguen de una soporte de name spaces a este lenguaje? Pues hasta el punto de organizar una petición on-line para implorar que por lo menos incluyan el parche de Jessie Hernandez en la próxima versión de PHP5.

El soporte de name spaces está en seria consideración para PHP6, con una álgida discusión en la lista de correo de php-internals sobre la mejor forma de implementar esta retrasadísima característica."

Antes que saliera la versión final de PHP5 leí la documentación sobre lo nuevo que incorporaba y se hacía referencia constante al concepto de "namespace". Al principio me sorprendió porque PHP5 se basa mucho en la sintaxis que usa Java para implementar los objetos y este usa la sintaxis "package" y solo en .Net se usaba "namespace".

La mayor sorpresa fue que cuando se liberó la versión final de PHP5, este no soportaba los "namespaces" (a pesar de haberlos probado en la beta).

Volviendo al tema, para ubicarnos un poco en el contexto, este tipo de sintaxis nos permite representar el concepto de diseño llamado "arquitectura en capas" o directamente "programación en tres capas" (pueden haber muchas más capas, pero generalmente se habla de que deberían existir por lo menos tres), donde deberíamos separar claramente las distintas responsabilidades básicas de nuestros sistemas.

La primer capa, la presentación, sería la encargada de manejar nuestra "interfaz" con los usuarios (pantallas gráficas, páginas web, etc), la segunda capa, el dominio o lógica, donde deberemos alojar el código que resuelve concretamente la problemática de nuestro sistema, y por último la tercer capa, la persistencia, que tendrá la responsabilidad de "persistir" la información, tanto almacenarla en una base de datos o en un archivo de texto (o en cualquier otro medio), para luego poder recuperarla cuando lo requiera nuestro sistema.

La idea de la "arquitectura orientada a capas" es que tenemos separadas de forma clara las responsabilidades, desacoplando nuestro código.

Si no tuviéramos capas, que es lo mismo que decir que tenemos una sola capa, nuestro código tendría entreveradas todas las responsabilidades. Cualquier cambio que se quiera hacer al código que implementa la interfaz afectaría a todo el resto del código. Si necesitáramos cambiar de interfaz (pasar de un sistema de escritorio de ventanas a un sistema web) deberíamos modificar todas las llamadas en nuestro código que cumplen esa tarea. Pero si tenemos "capas", podemos crear un nuevo "paquete" y sustituirlo por el anterior, y nuestro sistema debería poder seguir funcionando sin problemas. Sería exactamente el mismo caso si tuviéramos que cambiar de motor de bases de datos, solo deberíamos poder cambiar de "capa" y nuestro sistema seguir operativo (o por lo menos, las modificaciones solo afectarían un paquete, no al resto).

En UML cada capa representa un "paquete" (o viceversa), y estos contienen en su interior clases u otros paquetes, y en muchos lenguajes (como Java) esto se traduce físicamente en un directorio.

La idea es que si nuestro Gerente nos entrega el diagrama UML, nosotros deberíamos poder interpretar el diagrama y representarlo en código en alguno de los lenguajes disponibles que cumplan con la Orientación a Objetos.

La desventaja que tiene PHP, al no soportar los namespace, es que no podemos cumplir fielmente los diagramas UML al tener que incluir individualmente los archivos que vamos necesitando, cuando deberíamos poder hacer referencia directa a un "paquete" como una "unidad".

No es lo mismo decir en nuestro código:

namespace dominio;
namespace persistencia;

Que tener que hacer referencia a cada uno de los archivos que vamos a utilizar de nuestro "paquete":

require_once 'persistencia/BaseDeDatos.class.php';
require_once 'dominio/Clientes.class.php';
require_once 'dominio/Acreedores.class.php';
require_once 'dominio/Factura.class.php';
require_once 'dominio/LineaFactura.class.php';


Lo más grave de todo es que nos debilita el diseño al no permitirnos cumplir con lo básico de los "principios del diseño orientado a objetos". Nosotros deberíamos reusar "paquetes" y no partes concretas de esos paquetes (en este caso, serían las clases).

Esperemos que se implemente en PHP6 y demos un nuevo gran paso.

» Leer más, comentarios, etc...

PHP Senior

“Petición para soporte de Name Spaces en PHP5″

Abril 30th, 2006 - [Enlace local]

Este tema lo comenté por primera vez cuando escribí sobre cómo se representaría una arquitectura de 3 capas en PHP5. Ahora me entero que era más grave de lo que yo pensaba ;-)

Noticia extraida de VivaPHP:

"Petición para soporte de Name Spaces en PHP5 (07.04.2006)

PHP¿Hasta dónde pueden llegar los programadores de PHP en su súplica para que los desarrolladores de Zend vean la luz y agreguen de una soporte de name spaces a este lenguaje? Pues hasta el punto de organizar una petición on-line para implorar que por lo menos incluyan el parche de Jessie Hernandez en la próxima versión de PHP5.

El soporte de name spaces está en seria consideración para PHP6, con una álgida discusión en la lista de correo de php-internals sobre la mejor forma de implementar esta retrasadísima característica."

Antes que saliera la versión final de PHP5 leí la documentación sobre lo nuevo que incorporaba y se hacía referencia constante al concepto de "namespace". Al principio me sorprendió porque PHP5 se basa mucho en la sintaxis que usa Java para implementar los objetos y este usa la sintaxis "package" y solo en .Net se usaba "namespace".

La mayor sorpresa fue que cuando se liberó la versión final de PHP5, este no soportaba los "namespaces" (a pesar de haberlos probado en la beta).

Volviendo al tema, para ubicarnos un poco en el contexto, este tipo de sintaxis nos permite representar el concepto de diseño llamado "arquitectura en capas" o directamente "programación en tres capas" (pueden haber muchas más capas, pero generalmente se habla de que deberían existir por lo menos tres), donde deberíamos separar claramente las distintas responsabilidades básicas de nuestros sistemas.

La primer capa, la presentación, sería la encargada de manejar nuestra "interfaz" con los usuarios (pantallas gráficas, páginas web, etc), la segunda capa, el dominio o lógica, donde deberemos alojar el código que resuelve concretamente la problemática de nuestro sistema, y por último la tercer capa, la persistencia, que tendrá la responsabilidad de "persistir" la información, tanto almacenarla en una base de datos o en un archivo de texto (o en cualquier otro medio), para luego poder recuperarla cuando lo requiera nuestro sistema.

La idea de la "arquitectura orientada a capas" es que tenemos separadas de forma clara las responsabilidades, desacoplando nuestro código.

Si no tuviéramos capas, que es lo mismo que decir que tenemos una sola capa, nuestro código tendría entreveradas todas las responsabilidades. Cualquier cambio que se quiera hacer al código que implementa la interfaz afectaría a todo el resto del código. Si necesitáramos cambiar de interfaz (pasar de un sistema de escritorio de ventanas a un sistema web) deberíamos modificar todas las llamadas en nuestro código que cumplen esa tarea. Pero si tenemos "capas", podemos crear un nuevo "paquete" y sustituirlo por el anterior, y nuestro sistema debería poder seguir funcionando sin problemas. Sería exactamente el mismo caso si tuviéramos que cambiar de motor de bases de datos, solo deberíamos poder cambiar de "capa" y nuestro sistema seguir operativo (o por lo menos, las modificaciones solo afectarían un paquete, no al resto).

En UML cada capa representa un "paquete" (o viceversa), y estos contienen en su interior clases u otros paquetes, y en muchos lenguajes (como Java) esto se traduce físicamente en un directorio.

La idea es que si nuestro Gerente nos entrega el diagrama UML, nosotros deberíamos poder interpretar el diagrama y representarlo en código en alguno de los lenguajes disponibles que cumplan con la Orientación a Objetos.

La desventaja que tiene PHP, al no soportar los namespace, es que no podemos cumplir fielmente los diagramas UML al tener que incluir individualmente los archivos que vamos necesitando, cuando deberíamos poder hacer referencia directa a un "paquete" como una "unidad".

No es lo mismo decir en nuestro código:

namespace dominio;
namespace persistencia;

Que tener que hacer referencia a cada uno de los archivos que vamos a utilizar de nuestro "paquete":

require_once 'persistencia/BaseDeDatos.class.php';
require_once 'dominio/Clientes.class.php';
require_once 'dominio/Acreedores.class.php';
require_once 'dominio/Factura.class.php';
require_once 'dominio/LineaFactura.class.php';


Lo más grave de todo es que nos debilita el diseño al no permitirnos cumplir con lo básico de los "principios del diseño orientado a objetos". Nosotros deberíamos reusar "paquetes" y no partes concretas de esos paquetes (en este caso, serían las clases).

Esperemos que se implemente en PHP6 y demos un nuevo gran paso.

» Leer más, comentarios, etc...

Wink: grabación de la pantalla en formato Flash

Abril 30th, 2006 - [Enlace local]

peliculaWink es un programa gratuito para generar presentaciones en formato Macromedia Flash capturando lo que sucede en la pantalla, en un área o en la ventana de un programa (screencast).

Para tutoriales de aplicaciones, formación, grabación de errores, presentaciones…

.

» Leer más, comentarios, etc...

EasyBeans en Tomcat

Abril 29th, 2006 - [Enlace local]

Hace un par de días que apareció la nueva preview2 de EasyBeans. La principal novedad de esta versión es que funciona sobre Tomcat, faciltando a todos aquellos que no usan servidores de applicaciones J2EE como JOnAS el introducirse en nueva tecnología.

¿Por qué EasyBeans es una tecnología a tener en cuenta?. Muy sencillo, EasyBeans es una implementación open source de un contendedor que soporta la nueva especificación de EJB3. En la actualidad esta especificación está en estado de borrador final. Gracias al uso de EJBs el desarrollador puede abstraerse de una serie de problemas inherentes al desarrollo de aplicaciones como son los problemas de la persistencia, transacionalidad, concurrencia, etc…y delegar todo el trabajo “sucio” al contenedor.
Lo bueno de está nueva especificación es que se ha creado teniendo en mente la “facilidad de desarrollo” o EoD (Ease of Development). Si habeis usado alguna vez EJB 2.x sabreis que aunque el concepto es muy acertado, requiere de demasiados ficheros que dificultan el trabajo diario con ellos a no ser que se utilice alguna herramienta de generación de código tipo XDoclet que automatize la creación de la mayoría de los ficheros haciendo que el desarrollador solo se preocupe de tan solo uno de ellos. Además es necesario un Servidor de Aplicaciones que soporte la especificación J2EE.

Con EasyBeans conseguimos las mismas ventajas que nos daban los antiguos EJBs pero haciendonos la vida mucho más fácil a los desarrolladores gracias a que ahora podemos crear sencillos POJOs que son desplegados en el contenedor EJB3 el cual es capaz de correr tanto en un servidor de aplicaciones J2EE como JOnAS o en un simple contenedor de aplicaciones web como Tomcat. Hay que tener en cuenta que es necesario usar Java 1.5 debido a que gran parte de la simplificación en el desarrollo de EJBs se debe al uso de las nuevas annotations presentes en dicha distribución de Java.

Según el equipo de EasyBeans se espera que la release final de este producto open source sea para dentro de un par de meses aproximadamente (teniendo en cuenta que la especificación final de EJB3 está al caer).

Algunos links a tener en cuenta:

» Leer más, comentarios, etc...

Null Pointer Exception

Pasaba por aqui …

Abril 29th, 2006 - [Enlace local]

... y vi que la última entrada en este blog es del 29 de diciembre. Lo cierto es que desde principios de enero he estado muy liado (pero mucho) pero ahora por fin he vuelto a ver la luz, y además con nuevas energías, nuevos proyectos y muchas ganas de hacer muchas cosas (pero muchas).

Por ejemplo darle un repasito a este blog: cambiar la plantilla, poner una foto más reciente y arreglar un par de cosillas. Por ejemplo le he quitado las estadísticas, ya que la empresa en cuestión decidió poner un horrible pop-up cada vez que se visitaba la página. Lo cierto es que el tema de las estadísticas me resultaba curioso al principio, cuando inicié el blog ¿habría alguien dispuesto a leer lo que yo escribiera?¿cuantas personas? y en algún momento resultó hasta divertido comprobar como algún post tenía cierta relevancia y aumentaba el número de visitas (el actual record de visitas fue debido al "efecto barrapunto", pero no me acuerdo por qué post). Sin embargo ahora el tema de las estadísticas me preocupa mas bien poco, aunque quizás le eche un vistazo a alguna herramienta ¿alguna recomendación?

Y poco mas de momento, mas bien solo queria postear para decir que sigo vivo ...

» Leer más, comentarios, etc...

Null Pointer Exception

Pasaba por aqui …

Abril 29th, 2006 - [Enlace local]

... y vi que la última entrada en este blog es del 29 de diciembre. Lo cierto es que desde principios de enero he estado muy liado (pero mucho) pero ahora por fin he vuelto a ver la luz, y además con nuevas energías, nuevos proyectos y muchas ganas de hacer muchas cosas (pero muchas).

Por ejemplo darle un repasito a este blog: cambiar la plantilla, poner una foto más reciente y arreglar un par de cosillas. Por ejemplo le he quitado las estadísticas, ya que la empresa en cuestión decidió poner un horrible pop-up cada vez que se visitaba la página. Lo cierto es que el tema de las estadísticas me resultaba curioso al principio, cuando inicié el blog ¿habría alguien dispuesto a leer lo que yo escribiera?¿cuantas personas? y en algún momento resultó hasta divertido comprobar como algún post tenía cierta relevancia y aumentaba el número de visitas (el actual record de visitas fue debido al "efecto barrapunto", pero no me acuerdo por qué post). Sin embargo ahora el tema de las estadísticas me preocupa mas bien poco, aunque quizás le eche un vistazo a alguna herramienta ¿alguna recomendación?

Y poco mas de momento, mas bien solo queria postear para decir que sigo vivo ...

» Leer más, comentarios, etc...

Codigo que valida si una cadena solo tiene letras

Abril 29th, 2006 - [Enlace local]

Pequeño y sencillo codigo que valida si una cadena solamente esta formada por letras y por ningun otro caracter disinto

Codigo:



<?
$texto
= “textoConSoloLetras”;
if (
ereg(‘[^A-Za-z]’, $texto))
echo
“La frase contiene otros caracteres ademas de letras”;
else
echo
“La cadena solo contiene letras”;
?>


 

Si cambiamos la expresion regular podemos hacer q validar por cualquier cosa que nostros querramos

» Leer más, comentarios, etc...

Codigo que valida si una cadena solo tiene letras

Abril 29th, 2006 - [Enlace local]

Pequeño y sencillo codigo que valida si una cadena solamente esta formada por letras y por ningun otro caracter disinto



<?
$texto 
“textoConSoloLetras”;
if (
ereg(‘[^A-Za-z]’$texto)) 
 echo 
“La frase contiene otros caracteres ademas de letras”;
else
 echo 
“La cadena solo contiene letras”;
?>


 

Si cambiamos la expresion regular podemos hacer q validar por cualquier cosa que nostros querramos

» Leer más, comentarios, etc...

Codigo que valida si una cadena solo tiene letras

Abril 29th, 2006 - [Enlace local]

Pequeño y sencillo codigo que valida si una cadena solamente esta formada por letras y por ningun otro caracter disinto



<?
$texto 
“textoConSoloLetras”;
if (
ereg(‘[^A-Za-z]’$texto)) 
 echo 
“La frase contiene otros caracteres ademas de letras”;
else
 echo 
“La cadena solo contiene letras”;
?>


 

Si cambiamos la expresion regular podemos hacer q validar por cualquier cosa que nostros querramos

» Leer más, comentarios, etc...

Abrir un .pdf con Php

Abril 29th, 2006 - [Enlace local]

Simple codigo para abir un pdf mediante php, lo unico q hace falta es esptablecer las cabeceras adecuadas

Codigo:



<?
$pdf
= ‘archivos/documento.pdf’;
header(‘Content-type: application/pdf’);
header(‘Content-Disposition: attachment; filename=”‘.$pdf.‘”‘);
readfile($pdf);
?>


 

» Leer más, comentarios, etc...

Abrir un .pdf con Php

Abril 29th, 2006 - [Enlace local]

Simple codigo para abir un pdf mediante php, lo unico q hace falta es esptablecer las cabeceras adecuadas



<?
$pdf 
‘archivos/documento.pdf’
header(‘Content-type: application/pdf’);
header(‘Content-Disposition: attachment; filename=”‘.$pdf.‘”‘);
readfile($pdf);
?>


 

» Leer más, comentarios, etc...

Abrir un .pdf con Php

Abril 29th, 2006 - [Enlace local]

Simple codigo para abir un pdf mediante php, lo unico q hace falta es esptablecer las cabeceras adecuadas



<?
$pdf 
‘archivos/documento.pdf’
header(‘Content-type: application/pdf’);
header(‘Content-Disposition: attachment; filename=”‘.$pdf.‘”‘);
readfile($pdf);
?>


 

» Leer más, comentarios, etc...

Comprobar existencia de Libreria GD en el servidor

Abril 29th, 2006 - [Enlace local]

GD es una libreria para la generacion dinamica de imagenes.

Mediante este codigo podemos detectar si dicha libreria esta instalada en nuestro servidor

 

Codigo:



<?php
if(!function_exists(“gd_info”))
echo
“GD NO esta instalada en el servidor”;
else
echo
“GD SI esta instalada en el servidor”;
?>


 

» Leer más, comentarios, etc...

Comprobar existencia de Libreria GD en el servidor

Abril 29th, 2006 - [Enlace local]

GD es una libreria para la generacion dinamica de imagenes.

Mediante este codigo podemos detectar si dicha libreria esta instalada en nuestro servidor

 



<?php 
if(!function_exists(“gd_info”)) 
 echo 
“GD NO esta instalada en el servidor”
else
 echo 
“GD SI esta instalada en el servidor”
?> 


 

» Leer más, comentarios, etc...

Comprobar existencia de Libreria GD en el servidor

Abril 29th, 2006 - [Enlace local]

GD es una libreria para la generacion dinamica de imagenes.

Mediante este codigo podemos detectar si dicha libreria esta instalada en nuestro servidor

 



<?php 
if(!function_exists(“gd_info”)) 
 echo 
“GD NO esta instalada en el servidor”
else
 echo 
“GD SI esta instalada en el servidor”
?> 


 

» Leer más, comentarios, etc...

MD5 en Java script

Abril 29th, 2006 - [Enlace local]

En el post anterior explique como se podia usar PHP para codificar las contraseñas de nuestro sitio y asi brindar seguridad a nuestra aplicacion.

Con esto logramos cierta segurdad, es verdad, pero nos olvidamos de algo… que pasa cuando la contraseña pasa del navegador del cliente al servidor donde se encuentra el archivo php que guardara la contraseña.

Puede ser que en ese trayecto algun tercero se apodere de esa contraseña y asi puede infiltrarse en nuestra apliacion.

Esto no es muy agradable para nosotros ni para nadie

La solucion a esto es hacer que el cliente codifique la contraseña ingresada antes de enviarla al archivo php, para hacer esto utilizaremos JavaScript.

Buscando informacion me encontre con un codigo de Paul Johnston (web) muy interesante. Lo que hace es este codigo entre otras cosas, es si le pasas una cadena te devuevle el hash md5 de dicha cadena.

Me tome la libertad de modificarlo un poco a este codigo y me arme una clase usando las funciones del autor (Paul Johnston), aca les dejo el codigo y tambien subo un zip con un ejemplo de como se aplica

Codigo:



MD5 = {
/*
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.

* Modified by Federico Lozada Mosto (April 2006)
* Web: http://blog.3wstudio.com.ar
*/

/*
* Configurable variables. You may need to tweak these to be compatible with
* the server-side, but the defaults work in most cases.
*/
hexcase: 0,
b64pad: “”,
chrsz: 8,

/*
* These are the functions you’ll usually want to call
* They take string arguments and return either hex or base-64 encoded strings
*/
hex_md5:function(s) {
  return MD5.binl2hex(MD5.core_md5(MD5.str2binl(s), s.length * MD5.chrsz));
},

b64_md5:function(s){
  return MD5.binl2b64(MD5.core_md5(MD5.str2binl(s), s.length * MD5.chrsz));
},

str_md5:function(s){
  return MD5.binl2str(MD5.core_md5(MD5.str2binl(s), s.length * MD5.chrsz));
},

hex_hmac_md5:function(key, data) {
  return MD5.binl2hex(MD5.core_hmac_md5(key, data));
},

b64_hmac_md5:function(key, data) {
  return MD5.binl2b64(MD5.core_hmac_md5(key, data));
},

str_hmac_md5:function(key, data) {
  return MD5.binl2str(MD5.core_hmac_md5(key, data));
},

/*
* Perform a simple self-test to see if the VM is working
*/
md5_vm_test:function(){
  return MD5.hex_md5(”abc”) == “900150983cd24fb0d6963f7d28e17f72″;
},

/*
* Calculate the MD5 of an array of little-endian words, and a bit length
*/
core_md5:function(x, len){
  /* append padding */
  x[len >> 5] |= 0×80 << ((len) % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;
  
  var a = 1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d = 271733878;
  
  for(var i = 0; i < x.length; i += 16){
   var olda = a;
   var oldb = b;
   var oldc = c;
   var oldd = d;
  
   a = MD5.md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
   d = MD5.md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
   c = MD5.md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
   b = MD5.md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
   a = MD5.md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
   d = MD5.md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
   c = MD5.md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
   b = MD5.md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
   a = MD5.md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
   d = MD5.md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
   c = MD5.md5_ff(c, d, a, b, x[i+10], 17, -42063);
   b = MD5.md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
   a = MD5.md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
   d = MD5.md5_ff(d, a, b, c, x[i+13], 12, -40341101);
   c = MD5.md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
   b = MD5.md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
  
   a = MD5.md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
   d = MD5.md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
   c = MD5.md5_gg(c, d, a, b, x[i+11], 14, 643717713);
   b = MD5.md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
   a = MD5.md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
   d = MD5.md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
   c = MD5.md5_gg(c, d, a, b, x[i+15], 14, -660478335);
   b = MD5.md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
   a = MD5.md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
   d = MD5.md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
   c = MD5.md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
   b = MD5.md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
   a = MD5.md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
   d = MD5.md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
   c = MD5.md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
   b = MD5.md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
  
   a = MD5.md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
   d = MD5.md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
   c = MD5.md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
   b = MD5.md5_hh(b, c, d, a, x[i+14], 23, -35309556);
   a = MD5.md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
   d = MD5.md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
   c = MD5.md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
   b = MD5.md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
   a = MD5.md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
   d = MD5.md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
   c = MD5.md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
   b = MD5.md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
   a = MD5.md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
   d = MD5.md5_hh(d, a, b, c, x[i+12], 11, -421815835);
   c = MD5.md5_hh(c, d, a, b, x[i+15], 16, 530742520);
   b = MD5.md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
  
   a = MD5.md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
   d = MD5.md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
   c = MD5.md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
   b = MD5.md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
   a = MD5.md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
   d = MD5.md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
   c = MD5.md5_ii(c, d, a, b, x[i+10], 15, -1051523);
   b = MD5.md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
   a = MD5.md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
   d = MD5.md5_ii(d, a, b, c, x[i+15], 10, -30611744);
   c = MD5.md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
   b = MD5.md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
   a = MD5.md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
   d = MD5.md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
   c = MD5.md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
   b = MD5.md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
  
   a = MD5.safe_add(a, olda);
   b = MD5.safe_add(b, oldb);
   c = MD5.safe_add(c, oldc);
   d = MD5.safe_add(d, oldd);
  }
  return Array(a, b, c, d);
},

/*
* These functions implement the four basic operations the algorithm uses.
*/
md5_cmn:function(q, a, b, x, s, t){
  return MD5.safe_add(MD5.bit_rol(MD5.safe_add(MD5.safe_add(a, q), MD5.safe_add(x, t)), s),b);
},

md5_ff:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
},

md5_gg:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
},

md5_hh:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn(b ^ c ^ d, a, b, x, s, t);
},

md5_ii:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
},

/*
* Calculate the HMAC-MD5, of a key and some data
*/
core_hmac_md5:function(key, data){
  var bkey = MD5.str2binl(key);
  if(bkey.length > 16) bkey = MD5.core_md5(bkey, key.length * MD5.chrsz);

  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++){
   ipad[i] = bkey[i] ^ 0×36363636;
   opad[i] = bkey[i] ^ 0×5C5C5C5C;
  }

  var hash = MD5.core_md5(ipad.concat(MD5.str2binl(data)), 512 + data.length * MD5.chrsz);
  return MD5.core_md5(opad.concat(hash), 512 + 128);
},

/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
* to work around bugs in some JS interpreters.
*/
safe_add:function(x, y){
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
},

/*
* Bitwise rotate a 32-bit number to the left.
*/
bit_rol:function(num, cnt){
  return (num << cnt) | (num >>> (32 - cnt));
},

/*
* Convert a string to an array of little-endian words
* If MD5.chrsz is ASCII, characters >255 have their hi-byte silently ignored.
*/
str2binl:function(str){
  var bin = Array();
  var mask = (1 << MD5.chrsz) - 1;
  for(var i = 0; i < str.length * MD5.chrsz; i += MD5.chrsz)
   bin[i>>5] |= (str.charCodeAt(i / MD5.chrsz) & mask) << (i%32);
  return bin;
},

/*
* Convert an array of little-endian words to a string
*/
binl2str:function(bin){
  var str = “”;
  var mask = (1 << MD5.chrsz) - 1;
  for(var i = 0; i < bin.length * 32; i += MD5.chrsz)
   str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
  return str;
},

/*
* Convert an array of little-endian words to a hex string.
*/
binl2hex:function(binarray){
  var hex_tab = MD5.hexcase ? “0123456789ABCDEF” : “0123456789abcdef”;
  var str = “”;
  for(var i = 0; i < binarray.length * 4; i++){
   str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
   hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
  }
  return str;
},

/*
* Convert an array of little-endian words to a base-64 string
*/
binl2b64:function(binarray){
  var tab = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;
  var str = “”;
  for(var i = 0; i < binarray.length * 4; i += 3){
   var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
   | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
   | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
   for(var j = 0; j < 4; j++){
    if(i * 8 + j * 6 > binarray.length * 32) str += MD5.b64pad;
    else str += tab.charAt((triplet >> 6*(3-j)) & 0×3F);
   }
  }
  return str;
}
}


 

Ejemplo de utilizacion

Codigo:



<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>

<html>
<head>
<title>Ejemplo md5</title>

<script language=”javascript” type=”text/javascript” xsrc=”class.md5.js”></script>

</head>

<body>

<script>
alert(MD5.hex_md5(’3wstudio’));
</script>

</body>
</html>

 

 

 

» Leer más, comentarios, etc...

MD5 en Java script

Abril 29th, 2006 - [Enlace local]

En el post anterior explique como se podia usar PHP para codificar las contraseñas de nuestro sitio y asi brindar seguridad a nuestra aplicacion.

Con esto logramos cierta segurdad, es verdad, pero nos olvidamos de algo… que pasa cuando la contraseña pasa del navegador del cliente al servidor donde se encuentra el archivo php que guardara la contraseña.

Puede ser que en ese trayecto algun tercero se apodere de esa contraseña y asi puede infiltrarse en nuestra apliacion.

Esto no es muy agradable para nosotros ni para nadie

La solucion a esto es hacer que el cliente codifique la contraseña ingresada antes de enviarla al archivo php, para hacer esto utilizaremos JavaScript.

Buscando informacion me encontre con un codigo de Paul Johnston (web) muy interesante. Lo que hace es este codigo entre otras cosas, es si le pasas una cadena te devuevle el hash md5 de dicha cadena.

Me tome la libertad de modificarlo un poco a este codigo y me arme una clase usando las funciones del autor (Paul Johnston), aca les dejo el codigo y tambien subo un zip con un ejemplo de como se aplica



MD5 = {
 /*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 
 * Modified by Federico Lozada Mosto (April 2006)
 * Web: http://blog.3wstudio.com.ar 
 */
 
 /*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
 hexcase: 0,
 b64pad: ”",
 chrsz: 8,

 /*
 * These are the functions you’ll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
 hex_md5:function(s) { 
  return MD5.binl2hex(MD5.core_md5(MD5.str2binl(s), s.length * MD5.chrsz));
 },
 
 b64_md5:function(s){
  return MD5.binl2b64(MD5.core_md5(MD5.str2binl(s), s.length * MD5.chrsz));
 },
 
 str_md5:function(s){
  return MD5.binl2str(MD5.core_md5(MD5.str2binl(s), s.length * MD5.chrsz));
 },
 
 hex_hmac_md5:function(key, data) {
  return MD5.binl2hex(MD5.core_hmac_md5(key, data)); 
 },
 
 b64_hmac_md5:function(key, data) { 
  return MD5.binl2b64(MD5.core_hmac_md5(key, data)); 
 },
 
 str_hmac_md5:function(key, data) { 
  return MD5.binl2str(MD5.core_hmac_md5(key, data)); 
 },

 /*
 * Perform a simple self-test to see if the VM is working
 */
 md5_vm_test:function(){
  return MD5.hex_md5(”abc”) == ”900150983cd24fb0d6963f7d28e17f72″;
 },

 /*
 * Calculate the MD5 of an array of little-endian words, and a bit length
 */
 core_md5:function(x, len){
  /* append padding */
  x[len >> 5] |= 0×80 << ((len) % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;
  
  var a = 1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d = 271733878;
  
  for(var i = 0; i < x.length; i += 16){
   var olda = a;
   var oldb = b;
   var oldc = c;
   var oldd = d;
  
   a = MD5.md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
   d = MD5.md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
   c = MD5.md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
   b = MD5.md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
   a = MD5.md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
   d = MD5.md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
   c = MD5.md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
   b = MD5.md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
   a = MD5.md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
   d = MD5.md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
   c = MD5.md5_ff(c, d, a, b, x[i+10], 17, -42063);
   b = MD5.md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
   a = MD5.md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
   d = MD5.md5_ff(d, a, b, c, x[i+13], 12, -40341101);
   c = MD5.md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
   b = MD5.md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
  
   a = MD5.md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
   d = MD5.md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
   c = MD5.md5_gg(c, d, a, b, x[i+11], 14, 643717713);
   b = MD5.md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
   a = MD5.md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
   d = MD5.md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
   c = MD5.md5_gg(c, d, a, b, x[i+15], 14, -660478335);
   b = MD5.md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
   a = MD5.md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
   d = MD5.md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
   c = MD5.md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
   b = MD5.md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
   a = MD5.md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
   d = MD5.md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
   c = MD5.md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
   b = MD5.md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
  
   a = MD5.md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
   d = MD5.md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
   c = MD5.md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
   b = MD5.md5_hh(b, c, d, a, x[i+14], 23, -35309556);
   a = MD5.md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
   d = MD5.md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
   c = MD5.md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
   b = MD5.md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
   a = MD5.md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
   d = MD5.md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
   c = MD5.md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
   b = MD5.md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
   a = MD5.md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
   d = MD5.md5_hh(d, a, b, c, x[i+12], 11, -421815835);
   c = MD5.md5_hh(c, d, a, b, x[i+15], 16, 530742520);
   b = MD5.md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
  
   a = MD5.md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
   d = MD5.md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
   c = MD5.md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
   b = MD5.md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
   a = MD5.md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
   d = MD5.md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
   c = MD5.md5_ii(c, d, a, b, x[i+10], 15, -1051523);
   b = MD5.md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
   a = MD5.md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
   d = MD5.md5_ii(d, a, b, c, x[i+15], 10, -30611744);
   c = MD5.md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
   b = MD5.md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
   a = MD5.md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
   d = MD5.md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
   c = MD5.md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
   b = MD5.md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
  
   a = MD5.safe_add(a, olda);
   b = MD5.safe_add(b, oldb);
   c = MD5.safe_add(c, oldc);
   d = MD5.safe_add(d, oldd);
  }
  return Array(a, b, c, d);
 },

 /*
 * These functions implement the four basic operations the algorithm uses.
 */
 md5_cmn:function(q, a, b, x, s, t){
  return MD5.safe_add(MD5.bit_rol(MD5.safe_add(MD5.safe_add(a, q), MD5.safe_add(x, t)), s),b);
 },
 
 md5_ff:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
 },
 
 md5_gg:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
 },
 
 md5_hh:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn(b ^ c ^ d, a, b, x, s, t);
 },
 
 md5_ii:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
 },

 /*
 * Calculate the HMAC-MD5, of a key and some data
 */
 core_hmac_md5:function(key, data){
  var bkey = MD5.str2binl(key);
  if(bkey.length > 16) bkey = MD5.core_md5(bkey, key.length * MD5.chrsz);

  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++){
   ipad[i] = bkey[i] ^ 0×36363636;
   opad[i] = bkey[i] ^ 0×5C5C5C5C;
  }

  var hash = MD5.core_md5(ipad.concat(MD5.str2binl(data)), 512 + data.length * MD5.chrsz);
  return MD5.core_md5(opad.concat(hash), 512 + 128);
 },

 /*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
 safe_add:function(x, y){
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
 },

 /*
 * Bitwise rotate a 32-bit number to the left.
 */
 bit_rol:function(num, cnt){
  return (num << cnt) | (num >>> (32 - cnt));
 },

 /*
 * Convert a string to an array of little-endian words
 * If MD5.chrsz is ASCII, characters >255 have their hi-byte silently ignored.
 */
 str2binl:function(str){
  var bin = Array();
  var mask = (1 << MD5.chrsz) - 1;
  for(var i = 0; i < str.length * MD5.chrsz; i += MD5.chrsz)
   bin[i>>5] |= (str.charCodeAt(i / MD5.chrsz) & mask) << (i%32);
  return bin;
 },

 /*
 * Convert an array of little-endian words to a string
 */
 binl2str:function(bin){
  var str = ”";
  var mask = (1 << MD5.chrsz) - 1;
  for(var i = 0; i < bin.length * 32; i += MD5.chrsz)
   str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
  return str;
 },

 /*
 * Convert an array of little-endian words to a hex string.
 */
 binl2hex:function(binarray){
  var hex_tab = MD5.hexcase ? ”0123456789ABCDEF” : ”0123456789abcdef”;
  var str = ”";
  for(var i = 0; i < binarray.length * 4; i++){
   str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
   hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
  }
  return str;
 },

 /*
 * Convert an array of little-endian words to a base-64 string
 */
 binl2b64:function(binarray){
  var tab = ”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;
  var str = ”";
  for(var i = 0; i < binarray.length * 4; i += 3){
   var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
   | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
   | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
   for(var j = 0; j < 4; j++){
    if(i * 8 + j * 6 > binarray.length * 32) str += MD5.b64pad;
    else str += tab.charAt((triplet >> 6*(3-j)) & 0×3F);
   }
  }
  return str;
 }
}


 

Ejemplo de utilizacion



<!DOCTYPE HTML PUBLIC ”-//W3C//DTD HTML 4.01 Transitional//EN”>

<html>
<head>
 <title>Ejemplo md5</title>
 
 <script language=”javascript” type=”text/javascript” xsrc=”class.md5.js”></script>
 
</head>

<body>

<script>
alert(MD5.hex_md5(’3wstudio’));
</script>

</body>
</html>

 

 

 

» Leer más, comentarios, etc...

MD5 en Java script

Abril 29th, 2006 - [Enlace local]

En el post anterior explique como se podia usar PHP para codificar las contraseñas de nuestro sitio y asi brindar seguridad a nuestra aplicacion.

Con esto logramos cierta segurdad, es verdad, pero nos olvidamos de algo… que pasa cuando la contraseña pasa del navegador del cliente al servidor donde se encuentra el archivo php que guardara la contraseña.

Puede ser que en ese trayecto algun tercero se apodere de esa contraseña y asi puede infiltrarse en nuestra apliacion.

Esto no es muy agradable para nosotros ni para nadie

La solucion a esto es hacer que el cliente codifique la contraseña ingresada antes de enviarla al archivo php, para hacer esto utilizaremos JavaScript.

Buscando informacion me encontre con un codigo de Paul Johnston (web) muy interesante. Lo que hace es este codigo entre otras cosas, es si le pasas una cadena te devuevle el hash md5 de dicha cadena.

Me tome la libertad de modificarlo un poco a este codigo y me arme una clase usando las funciones del autor (Paul Johnston), aca les dejo el codigo y tambien subo un zip con un ejemplo de como se aplica



MD5 = {
 /*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 
 * Modified by Federico Lozada Mosto (April 2006)
 * Web: http://blog.3wstudio.com.ar 
 */
 
 /*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
 hexcase: 0,
 b64pad: ”",
 chrsz: 8,

 /*
 * These are the functions you’ll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
 hex_md5:function(s) { 
  return MD5.binl2hex(MD5.core_md5(MD5.str2binl(s), s.length * MD5.chrsz));
 },
 
 b64_md5:function(s){
  return MD5.binl2b64(MD5.core_md5(MD5.str2binl(s), s.length * MD5.chrsz));
 },
 
 str_md5:function(s){
  return MD5.binl2str(MD5.core_md5(MD5.str2binl(s), s.length * MD5.chrsz));
 },
 
 hex_hmac_md5:function(key, data) {
  return MD5.binl2hex(MD5.core_hmac_md5(key, data)); 
 },
 
 b64_hmac_md5:function(key, data) { 
  return MD5.binl2b64(MD5.core_hmac_md5(key, data)); 
 },
 
 str_hmac_md5:function(key, data) { 
  return MD5.binl2str(MD5.core_hmac_md5(key, data)); 
 },

 /*
 * Perform a simple self-test to see if the VM is working
 */
 md5_vm_test:function(){
  return MD5.hex_md5(”abc”) == ”900150983cd24fb0d6963f7d28e17f72″;
 },

 /*
 * Calculate the MD5 of an array of little-endian words, and a bit length
 */
 core_md5:function(x, len){
  /* append padding */
  x[len >> 5] |= 0×80 << ((len) % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;
  
  var a = 1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d = 271733878;
  
  for(var i = 0; i < x.length; i += 16){
   var olda = a;
   var oldb = b;
   var oldc = c;
   var oldd = d;
  
   a = MD5.md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
   d = MD5.md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
   c = MD5.md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
   b = MD5.md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
   a = MD5.md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
   d = MD5.md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
   c = MD5.md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
   b = MD5.md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
   a = MD5.md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
   d = MD5.md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
   c = MD5.md5_ff(c, d, a, b, x[i+10], 17, -42063);
   b = MD5.md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
   a = MD5.md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
   d = MD5.md5_ff(d, a, b, c, x[i+13], 12, -40341101);
   c = MD5.md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
   b = MD5.md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
  
   a = MD5.md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
   d = MD5.md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
   c = MD5.md5_gg(c, d, a, b, x[i+11], 14, 643717713);
   b = MD5.md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
   a = MD5.md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
   d = MD5.md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
   c = MD5.md5_gg(c, d, a, b, x[i+15], 14, -660478335);
   b = MD5.md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
   a = MD5.md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
   d = MD5.md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
   c = MD5.md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
   b = MD5.md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
   a = MD5.md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
   d = MD5.md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
   c = MD5.md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
   b = MD5.md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
  
   a = MD5.md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
   d = MD5.md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
   c = MD5.md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
   b = MD5.md5_hh(b, c, d, a, x[i+14], 23, -35309556);
   a = MD5.md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
   d = MD5.md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
   c = MD5.md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
   b = MD5.md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
   a = MD5.md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
   d = MD5.md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
   c = MD5.md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
   b = MD5.md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
   a = MD5.md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
   d = MD5.md5_hh(d, a, b, c, x[i+12], 11, -421815835);
   c = MD5.md5_hh(c, d, a, b, x[i+15], 16, 530742520);
   b = MD5.md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
  
   a = MD5.md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
   d = MD5.md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
   c = MD5.md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
   b = MD5.md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
   a = MD5.md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
   d = MD5.md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
   c = MD5.md5_ii(c, d, a, b, x[i+10], 15, -1051523);
   b = MD5.md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
   a = MD5.md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
   d = MD5.md5_ii(d, a, b, c, x[i+15], 10, -30611744);
   c = MD5.md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
   b = MD5.md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
   a = MD5.md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
   d = MD5.md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
   c = MD5.md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
   b = MD5.md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
  
   a = MD5.safe_add(a, olda);
   b = MD5.safe_add(b, oldb);
   c = MD5.safe_add(c, oldc);
   d = MD5.safe_add(d, oldd);
  }
  return Array(a, b, c, d);
 },

 /*
 * These functions implement the four basic operations the algorithm uses.
 */
 md5_cmn:function(q, a, b, x, s, t){
  return MD5.safe_add(MD5.bit_rol(MD5.safe_add(MD5.safe_add(a, q), MD5.safe_add(x, t)), s),b);
 },
 
 md5_ff:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
 },
 
 md5_gg:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
 },
 
 md5_hh:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn(b ^ c ^ d, a, b, x, s, t);
 },
 
 md5_ii:function(a, b, c, d, x, s, t){
  return MD5.md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
 },

 /*
 * Calculate the HMAC-MD5, of a key and some data
 */
 core_hmac_md5:function(key, data){
  var bkey = MD5.str2binl(key);
  if(bkey.length > 16) bkey = MD5.core_md5(bkey, key.length * MD5.chrsz);

  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++){
   ipad[i] = bkey[i] ^ 0×36363636;
   opad[i] = bkey[i] ^ 0×5C5C5C5C;
  }

  var hash = MD5.core_md5(ipad.concat(MD5.str2binl(data)), 512 + data.length * MD5.chrsz);
  return MD5.core_md5(opad.concat(hash), 512 + 128);
 },

 /*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
 safe_add:function(x, y){
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
 },

 /*
 * Bitwise rotate a 32-bit number to the left.
 */
 bit_rol:function(num, cnt){
  return (num << cnt) | (num >>> (32 - cnt));
 },

 /*
 * Convert a string to an array of little-endian words
 * If MD5.chrsz is ASCII, characters >255 have their hi-byte silently ignored.
 */
 str2binl:function(str){
  var bin = Array();
  var mask = (1 << MD5.chrsz) - 1;
  for(var i = 0; i < str.length * MD5.chrsz; i += MD5.chrsz)
   bin[i>>5] |= (str.charCodeAt(i / MD5.chrsz) & mask) << (i%32);
  return bin;
 },

 /*
 * Convert an array of little-endian words to a string
 */
 binl2str:function(bin){
  var str = ”";
  var mask = (1 << MD5.chrsz) - 1;
  for(var i = 0; i < bin.length * 32; i += MD5.chrsz)
   str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
  return str;
 },

 /*
 * Convert an array of little-endian words to a hex string.
 */
 binl2hex:function(binarray){
  var hex_tab = MD5.hexcase ? ”0123456789ABCDEF” : ”0123456789abcdef”;
  var str = ”";
  for(var i = 0; i < binarray.length * 4; i++){
   str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
   hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
  }
  return str;
 },

 /*
 * Convert an array of little-endian words to a base-64 string
 */
 binl2b64:function(binarray){
  var tab = ”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;
  var str = ”";
  for(var i = 0; i < binarray.length * 4; i += 3){
   var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
   | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
   | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
   for(var j = 0; j < 4; j++){
    if(i * 8 + j * 6 > binarray.length * 32) str += MD5.b64pad;
    else str += tab.charAt((triplet >> 6*(3-j)) & 0×3F);
   }
  }
  return str;
 }
}


 

Ejemplo de utilizacion



<!DOCTYPE HTML PUBLIC ”-//W3C//DTD HTML 4.01 Transitional//EN”>

<html>
<head>
 <title>Ejemplo md5</title>
 
 <script language=”javascript” type=”text/javascript” xsrc=”class.md5.js”></script>
 
</head>

<body>

<script>
alert(MD5.hex_md5(’3wstudio’));
</script>

</body>
</html>

 

 

 

» Leer más, comentarios, etc...

Codificacion con md5()

Abril 29th, 2006 - [Enlace local]

Md5() permite calcular el hash completo de una cadena o variable, este devuelve un valor de 32 digitos, compuesto por numeros y letras. 

 

Codigo:



<?
$texto
= “ejemplo”;
texto_md5 = md5($texto);
echo
“Texto original: ” . $texto;
echo
“<br>Texto codificado: ” . $texto_md5;
?>

 

 

Este tipo de codificacion es muy util para guardar contraseñas de los usuarios de un sitio web en una base de datos.

Un ejemplo de esto usando PHP seria:

Codigo:



<?
//codigo
$sql = “INSERT INTO usuarios (usuario, pass) VALUES (’3wstudio’, ‘”.md5(“3wstudio”).“‘”;
mysql_query($sql);
//codigo



 

Nos debemos acordar que el campo pass de nuestra base de datos debe ser de 32 bits 

Si no usamos una transmisión segura (pe: SSL) el problema de la inseguridad persiste. La contraseña al enviarse al servidor puede ser interseptada por un tercero y ahi nuestra seguridad se fue al diablo.

Lo mejor solucion es hacer que el cliente realize esta codificacion, y sea esta la qes enviada al servidor. De esta manera estaremos haciendo nuestras aplicaciones mas seguras.

En el siguiente post dejare el codigo de una clase en Java script para la obtencion del md5 de una cadena 

Para mas informarcion pueden entrar a estos enlaces wik, md5 en php

 

» Leer más, comentarios, etc...

Codificacion con md5()

Abril 29th, 2006 - [Enlace local]

Md5() permite calcular el hash completo de una cadena o variable, este devuelve un valor de 32 digitos, compuesto por numeros y letras. 

 



<?
$texto 
“ejemplo”;
texto_md5 md5($texto);
echo 
“Texto original: ” $texto;
echo 
“<br>Texto codificado: ” $texto_md5;
?> 

 

 

Este tipo de codificacion es muy util para guardar contraseñas de los usuarios de un sitio web en una base de datos.

Un ejemplo de esto usando PHP seria:



<?
//codigo
$sql “INSERT INTO usuarios (usuario, pass) VALUES (’3wstudio’, ’”.md5(“3wstudio”).“‘”;
mysql_query($sql);
//codigo 



 

Nos debemos acordar que el campo pass de nuestra base de datos debe ser de 32 bits 

Si no usamos una transmisión segura (pe: SSL) el problema de la inseguridad persiste. La contraseña al enviarse al servidor puede ser interseptada por un tercero y ahi nuestra seguridad se fue al diablo.

Lo mejor solucion es hacer que el cliente realize esta codificacion, y sea esta la qes enviada al servidor. De esta manera estaremos haciendo nuestras aplicaciones mas seguras.

En el siguiente post dejare el codigo de una clase en Java script para la obtencion del md5 de una cadena 

Para mas informarcion pueden entrar a estos enlaces wik, md5 en php

 

» Leer más, comentarios, etc...

Codificacion con md5()

Abril 29th, 2006 - [Enlace local]

Md5() permite calcular el hash completo de una cadena o variable, este devuelve un valor de 32 digitos, compuesto por numeros y letras. 

 



<?
$texto 
“ejemplo”;
texto_md5 md5($texto);
echo 
“Texto original: ” $texto;
echo 
“<br>Texto codificado: ” $texto_md5;
?> 

 

 

Este tipo de codificacion es muy util para guardar contraseñas de los usuarios de un sitio web en una base de datos.

Un ejemplo de esto usando PHP seria:



<?
//codigo
$sql “INSERT INTO usuarios (usuario, pass) VALUES (’3wstudio’, ’”.md5(“3wstudio”).“‘”;
mysql_query($sql);
//codigo 



 

Nos debemos acordar que el campo pass de nuestra base de datos debe ser de 32 bits 

Si no usamos una transmisión segura (pe: SSL) el problema de la inseguridad persiste. La contraseña al enviarse al servidor puede ser interseptada por un tercero y ahi nuestra seguridad se fue al diablo.

Lo mejor solucion es hacer que el cliente realize esta codificacion, y sea esta la qes enviada al servidor. De esta manera estaremos haciendo nuestras aplicaciones mas seguras.

En el siguiente post dejare el codigo de una clase en Java script para la obtencion del md5 de una cadena 

Para mas informarcion pueden entrar a estos enlaces wik, md5 en php

 

» Leer más, comentarios, etc...

Soy un Pecador !!!

Abril 28th, 2006 - [Enlace local]

Me entero via Fresqui de la traducción de un articulo americano , donde se revela la verdad oculta detras de las palabras de cooperación y bienestar social que mueven al Software Libre.

La verdad es que somos terroristas, y apoyamos al terrorismo por usar GNU/Linux.

En dicho articulo la autora, hace incapié en el hecho que Microsoft hace grandes esfuerzos por mantenernos a salvos de la amenaza de software Libre, y que de seguir asi podrias hasta romper la economia estadounidense.

Y como ustedes ya se habrán imaginado la compañia que esta de todo esto es … si es obvio Microsoft.com, si los mismos que enjuciaron a una pequeña compañia familiar por no usar sus productos (1), aquellos que cobran a un usuario por decirles un bug de su sistema (2).

Pero este estilo de decir y hacer las cosas no es nuevo en microsoft, puesto que ya antes nos ha llamado terroristas(3).

El mismo Microsoft que aun pagando un estudio para demostrar que es mejor q Linux, no pudo hacer otra cosa que un investigacion arreglada, donde se quizo ver si los usuarios de 20 años de windows podian adaptarse facilmente a desarrollar en Linux (unas pocas semanas ). Y encima les salio mal, ya que esos mismos estudiantes recomendaron linux para servidores y con un poco mas de tiempo seguro tambien lo hubieran hecho para desktop. (4)

“Los perros ladran Sancho, señal de que avanzamos … “

» Leer más, comentarios, etc...

AlexdwBlog()

Hola mundo en AMFPHP y Flex 2.0

Abril 28th, 2006 - [Enlace local]

Hoy he tenído un rato para buscar algo de información y empezar a coquetear con Flex y AMFPHP y la verdad es que el resultado ha sido grato. Lo primero que hice fue instalar amfphp en mi sistema. Para ello bajé la version 1.2 de AMFPHP, la descomprimí y copie sus 3 carpetas dentro mi carpata [...]

» Leer más, comentarios, etc...