{"id":138,"date":"2010-08-20T14:48:09","date_gmt":"2010-08-20T19:48:09","guid":{"rendered":"http:\/\/sergiob.org\/wordpress\/?p=138"},"modified":"2010-08-20T14:48:09","modified_gmt":"2010-08-20T19:48:09","slug":"od-y-la-importancia-de-los-saltos-de-linea","status":"publish","type":"post","link":"https:\/\/blog.sergiob.org\/?p=138","title":{"rendered":"od, y la importancia de los saltos de l\u00ednea"},"content":{"rendered":"<p>Cuando uno se dedica al negocio de la computaci\u00f3n, a veces se nos olvida que lo que nosotros vemos no es exactamente lo que las computadoras procesan. Lo que para nosotros son frases, im\u00e1genes o sonido, las computadoras interpretan como se\u00f1ales: an\u00e1logas (como cuando hablamos por micr\u00f3fono) y digitales (casi todo lo dem\u00e1s), tambi\u00e9n llamadas <em>discretas<\/em>.<\/p>\n<p>Este punto sali\u00f3 a colaci\u00f3n hace apenas unos minutos, mientras trabajaba en una rutina de firmado. Para quienes no lo conozcan, el proceso de firmado digital funciona de la siguiente manera:<\/p>\n<p>&#8211; Obtener los datos a firmar<br \/>\n&#8211; Calcular una suma (tambi\u00e9n conocido como hash) de los datos &#8212; un valor \u00fanico y (supuestamente) irrepetible que identifica dichos datos.<br \/>\n&#8211; Cifrar esta suma obtenida, con alguna llave privada.<\/p>\n<p>El proceso es probablemente mejor explicado por <a href=\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2b\/Digital_Signature_diagram.svg\">Wikipedia<\/a>, pero el concepto es sencillo. Particularmente para aquellos que entienden criptograf\u00eda de llave p\u00fablica&#8230; pero creo que me desv\u00edo del tema. Ligeramente.<\/p>\n<p>El problema de este tipo de firmados es que las sumas son extremadamente sensibles a cambios en los datos. Para ejemplo, vean los resultados de dos cadenas ligeramente diferentes. La cadena &#8220;hola&#8221;, calculando su MD5 (un tipo de suma), nos entrega:<\/p>\n<p>916f4c31aaa35d6b867dae9a7f54270d<\/p>\n<p>La cadena &#8220;hola.&#8221; (n\u00f3tese: id\u00e9ntica, excepto por el punto al final) nos entrega un MD5 completamente diferente:<\/p>\n<p>296366cea89e11cdc7999e42463575fe<\/p>\n<p>De hecho, esta es la (supuesta y desde hace a\u00f1os demostrativamente falsa, en algunos casos) fortaleza de las sumas de seguridad. La idea que una combinaci\u00f3n de datos diferente nos entregue, siempre, necesariamente, resultados diferentes, es la <em>raison d&#8217;\u00eatre<\/em> de las sumas de seguridad.<\/p>\n<p>Bueno, pues todo suena fabuloso, excepto cuando no te sale. Resulta que el proceso de firmado que estabamos realizando (un proyecto del cual hablar\u00e9 m\u00e1s despu\u00e9s) no estaba funcionando como debe. Y despu\u00e9s de varios d\u00edas de estarme peleando mentalmente con el problema (&#8216;debe ser un problema con el algoritmo&#8217;, pensaba) me decid\u00ed a adentrarme en el problema a fondo.<\/p>\n<p>Revis\u00e9 el RFC respectivo; busqu\u00e9 soluciones alternativas; visit\u00e9 blogs extra\u00f1os en busca de respuestas. Nadie supo darme raz\u00f3n de lo ocurrido, aunque para ser franco no *consult\u00e9* con nadie, m\u00e1s bien busqu\u00e9 y no encontr\u00e9. De pronto, y por pura suerte, encontr\u00e9 una alusi\u00f3n al est\u00e1ndar de codificaci\u00f3n (UTF-8, en caso de que alguien est\u00e9 interesado), y eso me hizo pensar &#8212; los est\u00e1ndares de codificaci\u00f3n solo son diferentes representaciones binarias de lo mismo. Binarias&#8230; binarias&#8230;<\/p>\n<p>Seguramente alg\u00fan problema hab\u00eda con la representaci\u00f3n binaria. Si cambiamos una letra, las sumas cambias &#8211; es evidente, porque cambiamos el bloque de bits. Una codificaci\u00f3n diferente seguramente causar\u00eda un efecto desastroso en las sumas. Y me d\u00ed a la tarea de investigar como buscar la representaci\u00f3n binaria de algo, en linux (siendo este mi plataforma de preferencia para lo que estamos haciendo).<\/p>\n<p>Me top\u00e9 con un viejo amigo: hexdump. Este comando permite la salida hexadecimal de informaci\u00f3n. Nada del otro mundo, y aparentemente no encontr\u00e9 nada. Pero persisti\u00f3 la b\u00fasqueda. Me fu\u00ed a topar con <a href=\"http:\/\/objectmix.com\/perl\/304708-why-doesnt-digest-md5-md5_hex-match-gnu-md5sum.html#post1073811\">este<\/a> post (casualmente, una mezcla de problemas con MD5 y visualizaci\u00f3n binaria). Y discuten un punto sencillo: la salida de una funci\u00f3n de c\u00e1lculo MD5 y la salida del comando cl\u00e1sico de linux, md5sum, no son las mismas. Pero&#8230; \u00bfporque?<\/p>\n<p>Un vistazo con od (un comando de salida octal, as\u00ed como de otros formatos &#8211; seg\u00fan su manpage) di\u00f3 la respuesta:<\/p>\n<p>io@maquina:~$ echo &#8220;hola&#8221; | od -c<br \/>\n0000000   h   o   l   a  n<br \/>\n0000005<\/p>\n<p>N\u00f3tese el molesto, maligno y nada bien recibido salto de l\u00ednea, al final de &#8220;hola&#8221;. Yo no lo puse. \u00bfQui\u00e9n diablos se atreve a modificar mi cadena?<\/p>\n<p>El sistema, aparentemente. Linux es muy servicial, y se dispone a agregar saltos de l\u00ednea a cualquier &#8220;echo&#8221; que yo realice. De hecho, debo especificar <em>expl\u00edcitamente<\/em> que no se den estos saltos. Y eso hace, por supuesto, toda la diferencia a la hora de calcular una suma &#8211; esos bits adicionales para se\u00f1alizar el salto de l\u00ednea son tomados en cuenta para el c\u00e1lculo.<\/p>\n<p>Basta comparar las salidas:<\/p>\n<p>io@maquina:~$ echo &#8220;hola&#8221; | md5sum<br \/>\n916f4c31aaa35d6b867dae9a7f54270d  &#8211;<br \/>\nio@maquina:~$ echo -n &#8220;hola&#8221; | md5sum<br \/>\n4d186321c1a7f0f354b297e8914ab240  &#8211;<\/p>\n<p>Donde, por supuesto, &#8220;echo -n&#8221; especifica a echo que NO incluya un salto de l\u00ednea al final.<\/p>\n<p>Regreso a mis actividades, por el momento. Pero el d\u00eda de hoy no se me olvida&#8230; y en el futuro, tendr\u00e9 m\u00e1s cuidado con estas salidas. Detalles que uno va aprendiendo poco a poco&#8230; \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuando uno se dedica al negocio de la computaci\u00f3n, a veces se nos olvida que lo que nosotros vemos no es exactamente lo que las computadoras procesan. Lo que para nosotros son frases, im\u00e1genes o sonido, las computadoras interpretan como se\u00f1ales: an\u00e1logas (como cuando hablamos por micr\u00f3fono) y digitales (casi todo lo dem\u00e1s), tambi\u00e9n llamadas &hellip; <a href=\"https:\/\/blog.sergiob.org\/?p=138\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;od, y la importancia de los saltos de l\u00ednea&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[47,119],"class_list":["post-138","post","type-post","status-publish","format-standard","hentry","category-geek","tag-criptografia","tag-supergeek"],"_links":{"self":[{"href":"https:\/\/blog.sergiob.org\/index.php?rest_route=\/wp\/v2\/posts\/138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.sergiob.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.sergiob.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.sergiob.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.sergiob.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=138"}],"version-history":[{"count":0,"href":"https:\/\/blog.sergiob.org\/index.php?rest_route=\/wp\/v2\/posts\/138\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.sergiob.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.sergiob.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.sergiob.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}