{"id":1291,"date":"2015-03-02T01:38:43","date_gmt":"2015-03-02T07:38:43","guid":{"rendered":"https:\/\/www.lastdragon.net\/?p=1291"},"modified":"2015-03-02T01:38:43","modified_gmt":"2015-03-02T07:38:43","slug":"firmar-un-archivo-con-claves-publicas-y-privadas","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=1291","title":{"rendered":"Firmar un archivo con claves p\u00fablicas y privadas"},"content":{"rendered":"<p>Firmar un archivo no es otra cosa que garantizar su fuente de origen. Recordando lo b\u00e1sico del uso de las llaves.<\/p>\n<p>La privada es una llave que puede cifrar algo y esto se puede descifrar con la p\u00fablica y de la p\u00fablica cualquiera puede tener acceso a ella, esto no es para cifrar el contenido del archivo y que nadie lo m\u00e1s lo vea. Usando la l\u00f3gica sabemos que si algo es cifrado con la clave privada y esa clave solo la conoce el autor del archivo, significa que solo \u00e9l pudo firmar el archivo. En este caso la llave p\u00fablica solo sirve para confirmar que el documento o archivo provienen de quien se dice que viene.<\/p>\n<p>Los usos de esto son muchos, el primero es evitar la suplantaci\u00f3n de identidad, si alguien env\u00eda un memor\u00e1ndum en una empresa firmando como el director general se debe poder confirmar que el memor\u00e1ndum viene de quien dice venir, del director y que no ha sido otra persona que simplemente se paso por el . Otro uso inmediato es la incorruptibilidad del documento. Nadie podr\u00eda modificar el documento en lo m\u00e1s m\u00ednimo, ni un solo punto y coma podr\u00eda ser agregados o retirados. Muy \u00fatil para firmar ordenes de compras, documento autorizados o cotizaciones.<\/p>\n<p><strong>\u00bf  Por qu\u00e9 usar llaves p\u00fablicas y privadas ( RSA ) en lugar de una simple sumatoria MD5 ?<\/strong><\/p>\n<p>La respuesta es simple, Colisiones MD5, aqu\u00ed no hay colisi\u00f3n posible por lo que es mucho m\u00e1s seguro firmar con RSA que con MD5<\/p>\n<p>Puedes probar esto con archivos que he firmado para este art\u00edculo<br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/firmados.zip\">Desc\u00e1rgalos aqu\u00ed<\/a> y <a href=\"https:\/\/www.lastdragon.net\/verifiarchivos\/\">verif\u00edcalos aqu\u00ed<\/a><br \/>\n<strong><br \/>\nVideo mostrando el funcionamiento<\/strong><\/p>\n<p><iframe loading=\"lazy\" width=\"420\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/YgoN5JmSBFs\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>El siguiente  c\u00f3digo de PHP muestra de forma r\u00e1pida como firmar documentos y como verificarlos, se asume que ya se cuenta con una llave p\u00fablica y privada.<\/p>\n<p><strong>Verificar la firma<\/strong><\/p>\n<p><code><br \/>\n&lt;?php<br \/>\n$uploads_dir = \"\/basuradelabasura\/tmp\";<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $tmp_name =<br \/>\n$_FILES[\"userfile\"][\"tmp_name\"][0];<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $name1 =<br \/>\n$_FILES[\"userfile\"][\"name\"][0];<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nmove_uploaded_file($tmp_name, \"$uploads_dir\/$name1\");<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $tmp_name =<br \/>\n$_FILES[\"userfile\"][\"tmp_name\"][1];<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $name2 =<br \/>\n$_FILES[\"userfile\"][\"name\"][1];<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nmove_uploaded_file($tmp_name, \"$uploads_dir\/$name2\");<\/p>\n<p>\n$archivo1 = $uploads_dir.\"\/\".$name1;<br \/>\n$archivo2 = $uploads_dir.\"\/\".$name2;<\/p>\n<p>$gestor = fopen($archivo1, \"r\");<br \/>\n$dato = fread($gestor, filesize($archivo1));<br \/>\nfclose($gestor);<\/p>\n<p>$gestor = fopen($archivo2, \"r\");<br \/>\n$firma = fread($gestor, filesize($archivo2));<br \/>\nfclose($gestor);<\/p>\n<p>unlink ($archivo1);<br \/>\nunlink ($archivo2);<\/p>\n<p>\/\/ El contenido de $Dato y $Firma deben ser los archivos completos.<br \/>\n$respuesta =<br \/>\nopenssl_verify($dato,$firma,\"file:\/\/publica.key\",OPENSSL_ALGO_SHA256);<\/p>\n<p>\nif ($respuesta == 1) echo \"Valido\";<\/p>\n<p>else echo \"Falso\";<br \/>\n?&gt;<\/p>\n<p><\/code><\/p>\n<p><strong>Firmar un archivo<\/strong><\/p>\n<p><code><br \/>\n&lt;?php<br \/>\n$uploads_dir = \"\/basuradelabasura\/tmp\";<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $tmp_name =<br \/>\n$_FILES[\"userfile\"][\"tmp_name\"][0];<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $name1 =<br \/>\n$_FILES[\"userfile\"][\"name\"][0];<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nmove_uploaded_file($tmp_name, \"$uploads_dir\/$name1\");<\/p>\n<p>\n$archivo1 = $uploads_dir.\"\/\".$name1;<\/p>\n<p>$gestor = fopen($archivo1, \"r\");<br \/>\n$dato = fread($gestor, filesize($archivo1));<br \/>\nfclose($gestor);<\/p>\n<p>unlink ($archivo1);<\/p>\n<p>\/\/ El contenido de dato es el archivo que se ha subido a fima y $firma<br \/>\nobtendra el valor de la firma que debe ser volada al archivo.sig<br \/>\n$respuesta = openssl_sign($dato, $firma, \"file:\/\/privada.key\",<br \/>\nOPENSSL_ALGO_SHA256);<\/p>\n<p>if ($respuesta == TRUE) {<br \/>\nheader(\"Content-Type: application\/octet-stream\");<br \/>\nheader(\"Content-Disposition: attachment; filename=\\\"$name1.sig\\\"\");<br \/>\necho $firma;<br \/>\n}<\/p>\n<p>?&gt;<br \/><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Firmar un archivo no es otra cosa que garantizar su fuente de origen. Recordando lo b\u00e1sico del uso de las llaves. La privada es una llave que puede cifrar algo y esto se puede descifrar con la p\u00fablica y de la p\u00fablica cualquiera puede tener acceso a ella, esto no es para cifrar el contenido&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1291","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1291"}],"version-history":[{"count":1,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1291\/revisions"}],"predecessor-version":[{"id":1292,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/1291\/revisions\/1292"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}