{"id":79,"date":"2013-12-13T23:34:05","date_gmt":"2013-12-13T23:37:35","guid":{"rendered":"https:\/\/e6ebcpassword-msql.png"},"modified":"2015-07-16T19:15:37","modified_gmt":"2015-07-17T01:15:37","slug":"guardar-contrasenas-en-mysql","status":"publish","type":"post","link":"https:\/\/emanuelpaxtian.com\/blog\/guardar-contrasenas-en-mysql\/","title":{"rendered":"Guardar contrase\u00f1as en MySQL"},"content":{"rendered":"<p>Existen ciertas normas que nos prohiben almacenar contrase\u00f1as con texto plano y adem\u00e1s esta nunca ha sido una buena opci\u00f3n, si queremos que nuestros usuarios se sientan seguros utilizando nuestros sistemas, debemos proporcionarles un nivel superior.<\/p>\n<p>Todo buen administrador sabe que crear una tabla con contrase\u00f1as totalmente accesibles es un fallo de seguridad tremendo. Imaginemos por un momento que pasar\u00eda si un hacker consiguiese llegar hasta nuestra tabla usuarios, sacar un listado de las contrase\u00f1as o peor a\u00fan, modificarlas.<\/p>\n<p>Si este sistema guarda informaci\u00f3n sensible podr\u00eda convertirse en un serio problema empresarial, por lo que la seguridad en cuanto a contrase\u00f1as siempre debe ser una premisa para nosotros. Por suerte, MySQL nos da diferentes herramientas para hacer nuestras contrase\u00f1as m\u00e1s seguras, vamos a enumerarlas desde la menos segura hasta la m\u00e1s segura de todas:<\/p>\n<p>Password<br \/>\nEsta funci\u00f3n est\u00e1 presente desde hace unas cuantas versiones, pero sin embargo se ha demostrado que es f\u00e1cilmente vulnerable por lo que no merece la pena explicarla.<\/p>\n<p>MD5<br \/>\nPara guardar una contrase\u00f1a encriptada con MD5 necesitaremos una tabla con un campo de 32 caracteres, aunque se ha demostrado que el algoritmo MD5 puede ser vulnerado, la pr\u00e1ctica es tan compleja que no merece la pena el esfuerzo, el algoritmo MD5 no puede ser revertido, es decir, no se pueden recuperar contrase\u00f1as de este sistema.<\/p>\n<p>Insertar una contrase\u00f1a con MD5:<\/p>\n<pre class=\"brush: sql\">mysql&gt; INSERT INTO usuarios VALUES('usuario',MD5('contrase\u00f1a'));<\/pre>\n<p>SHA o SHA1<br \/>\nLa funci\u00f3n SHA y SHA1 son sin\u00f3nimos, por lo que hacen el mismo efecto, al igual que MD5 no puede ser revertido y este necesita un campo de 40 caracteres para su almacenamiento, es m\u00e1s seguro que MD5 ya que calcula el cheksum SHA de 160 bits de una cadena, mientras que MD5 la calcula de 128.<\/p>\n<p>Insertar una contrase\u00f1a con SHA:<\/p>\n<pre class=\"brush: sql\">mysql&gt; INSERT INTO usuarios VALUES('usuario',SHA('contrase\u00f1a'));<\/pre>\n<p>AES<br \/>\nEl algoritmo AES es el m\u00e1s completo y complejo, tiene posibilidad de revertirse y se utiliza con una llave privada, es decir, debemos proporcionar dicha llave para encriptar y desencriptar las contrase\u00f1as. Ser\u00eda vulnerable en el caso de que alguien consiguiese violar nuestro c\u00f3digo fuente y viera que llave estamos pasando a la cadena. Para almacenar estas contrase\u00f1as necesitamos que nuestro campo sea de tipo BLOB, ya que el resultado de la operaci\u00f3n ser\u00e1 un dato binario muy aleatorio.<\/p>\n<p>Insertar una contrase\u00f1a con AES:<\/p>\n<pre class=\"brush: sql\">mysql&gt; INSERT INTO usuarios VALUES('usuario',AES_ENCRYPT('contrase\u00f1a','llave'));<\/pre>\n<p>Para desencriptar:<\/p>\n<pre class=\"brush: sql\">mysql&gt; INSERT INTO usuarios VALUES('usuario',AES_DECRYPT('contrase\u00f1a','llave'));<\/pre>\n<p>Si quieres utilizar la funci\u00f3n AES, debes de tener una versi\u00f3n de MySQL superior a la 4.0.2, ya que es cuando esta funci\u00f3n fue agregada.<\/p>\n<p>Por lo tanto ahora sabemos que la \u00fanica manera (por ahora) de que nuestras contrase\u00f1as sean totalmente seguras, es utilizando la funci\u00f3n AES, y asegurarse que nadie puede acceder a nuestro c\u00f3digo fuente.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Existen ciertas normas que nos prohiben almacenar contrase\u00f1as con texto plano y adem\u00e1s esta nunca ha sido una buena opci\u00f3n, si queremos que nuestros usuarios se sientan seguros utilizando nuestros&hellip;<\/p>\n","protected":false},"author":1,"featured_media":680,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[],"class_list":["post-79","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mysql"],"_links":{"self":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/79","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/comments?post=79"}],"version-history":[{"count":0,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/posts\/79\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/media\/680"}],"wp:attachment":[{"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/media?parent=79"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/categories?post=79"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/emanuelpaxtian.com\/blog\/wp-json\/wp\/v2\/tags?post=79"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}