El fin del hacking por ingeniería social

La mayor parte de los sistemas de acceso a las webs, correos o cualquier otro sistema informático son técnicamente lo suficientemente robustos para que utilizar métodos de fuerza bruta o criptográficos sea muy, muy complicado (hablo de webs que ya tengan ssl, ordenadores que no tengan keyloggers ni cosas de esas). De hecho los medios para romper una clave rsa que tuvo que poner la NSA (11.000 millones de dólares) no están al alcance de cualquier hacker y, desde luego, no de cualquier hacker que ande por ahí. Sin embargo, se siguen produciendo ataques, filtraciones e intrusiones en nuestras cuentas usando el método más barato de todos: la ingeniería social.

Mediante ingeniería social lo que un hacker hace es tratar de que tu mismo le entregues tus claves o, en el peor de los casos, utilizar alguna clave tuya conocida para derivar la que puede ser tu clave para ese sistema. En 2004 el New York Post publicaba un artículo en el que se describía un experimento por el que un desconocido ofrecía un dulce a cualquiera que le diese la contraseña de su correo… Y el resultado fue sorprendente, 7 de cada 10 personas entregaron la contraseña de su correo. De esta manera da igual que tengamos SSL, TLS, un sistema límpio, y todas las medidas que queramos que mediante ingeniería social cualquier atacante puede descubir nuestras contraseñas. Además, nuestro cerebro no es capaz de recordar secuencias de caracteres aleatorios, o al menos no muchas, por lo que al final solemos usar alguna heurística para tener una sola contraseña y derivar otras en base a esas. Un sistema que conduce, irremisiblemente a regalar nuestras contraseñas a cualquiera que esté interesado por ellas.

¿Cual es mi solución? Muy sencillo, que el usuario no sepa las contraseñas, no es necesario cambiar ningún sistema, ni recordar nada, ni preocuparse lo más mínimo, simplemente olvidate de las contraseñas. Para conseguir esto he creado el sistema nomorepass, que además de generarte contraseñas y almacenarlas de manera segura en tu dispositivo móvil (y solo en tu dispositivo, nada de copiarlo en la nube, ni en nuestros servidores, ni en los ordenadores) te permite enviarlas de manera segura a la web o el dispositivo que la necesita… Todo ello sin que tu tengas que saber cual es la contraseña y, por tanto, sin poder ser presa de la ingeniería social.

Llevando esto al extremo, he desarrollado un nuevo plugin para wordpress que permite hacer los registros de usuario de manera automática, sin tener que elegir un password y que lo almacena directamente y de forma segura en tu app nomorepass. Puedes hacer la prueba registrándote en este blog, simplemente pincha aquí, escribe tu nick y tu email, pincha en el icono de nomorepass y luego escanea el qr con la app usando el botón rojo. ¡voila! ya estás registrado y con tus credenciales en tu teléfono… ¡Y ni siquiera sabes qué contraseña has usado!!

Deja de usar sistemas obsoletos, de escribir las contraseñas en papeles, tener una sola contraseña (con variaciones) para todas tus cuentas o, simplemente, deja de acordarte de tus contraseñas… Usa nomorepass. Es gratis, pero si, además, quieres tener una seguridad extra puedes suscribirte, si dejas un comentario en esta entrada te enviaré un código para que puedas disfrutar de todas las funcionalidades premium durante un mes… ¿Qué esperas?

NoMorePass (y yo) en Hora 25

Hoy he tenido la oportunidad de salir en el espacio Estartapeando dentro de Hora 25 en la cadena ser hablando de NoMorePass… Pero mejor os lo dejo para que podáis escucharlo a gusto…

Y si tenéis curiosidad, pues nada, a probar NoMorePass y me contáis después lo que opinais.

P.D: Si queréis escucharlo sin la molesta musiquita de fondo (que nos mete la ser cuando nos descargamos el audio), podéis escucharlo aquí: http://play.cadenaser.com/audio/001RD010000004813845/?ssm=fb

¿El emprendedor nace o se hace?

Esta es una de las preguntas que se plantearon en uno de los talleres de la aceleradora en la que estamos con nomorepass, la verdad es que la respuesta no es única, sino que varía en función del emprendedor, había quien estaba allí obligado, quien tuvo un tardío despertar o quien, como yo, sentía la llamada desde pequeño.

Al principio me pareció una pregunta tonta, incluso trampa, para obtener una respuesta «políticamente correcta» sobre el equilibrio entre los genes y la educación, pero a mi me sirvió para darme cuenta que, realmente, ahora estoy haciendo lo que siempre había querido hacer. Recordé que mi heroe de pequeño era el tio Gilito, el tío rico de los sobrinos de Donald y cuyas aventuras yo seguía avidamente en mis tiempos mozos leyendo tebeos «Don Miki.

Quizá lo que me atrajo al principio fue el hecho de estar «forrado», pero recordando esta época lo que me atraía de este personaje no era el mucho o poco dinero que pudiese tener, ni sus problemas con los golfos apandadores, sino que todo lo que tenía lo había conseguido por sí mismo. Le costaba una enormidad gastar la más mínima cantidad de su inmensa fortuna y estaba siempre ocupado haciendo negocios, pero a mi me gustaba por que había ganado todo ese dinero por sus propios medios, siguiendo su pasión y siendo libre allí donde iba.

Si, quizá ese no era el personaje más popular de los de Disney, pero, oye, para mi lo era. No puedo releer las historias de mi infancia porque, como tantas otras cosas, desaparecieron de mi casa por arte de magia (o de limpieza, como diría mi madre).

Haciendo memoria, recuerdo que cuando me asaltó la fiebre por la informática, de la que todavía no me he librado, una de las primeras cosas «raras» que hice con mi CPC464 es crear un «banco» donde permitía a mis hermanas depositar su dinero y tener su propia cuenta bancaria… Creo que ya apuntaba maneras. También recuerdo que, al poco de cumplir los 18 años, impulsado por la misma fiebre emprendedora de mi ídolo de papel, creí necesario informarme de lo que se necesitaba para crear una empresa, todavía no sabía de qué, y mandé una consulta por correo a un organismo pùblico (no recuerdo cual) y de la que, para mi sorpresa, recibí respuesta en forma de un documento larguísimo con todas las opciones y trámites que tendría que realizar para crear una empresa… De hecho ya tenía hasta el nombre: «Illusion». Pero como no tenía modelo de negocio y los trámites eran largos, tediosos y costosos ahí terminó mi primera etapa de emprendedor en ciernes.

Aunque cada vez me fuí imbuyendo más y más del espíritu de la informática, nunca abandoné mis tendencias emprendedoras. Admiraba y admiro a los grandes de la informática tanto por su destreza técnica como por la forma en que pudieron crear algo grande (yo siempre digo que quiero ser Wozniak en vez de Jobs, pero también reconozco que Bill Gates creó algo de la nada e hizo más por popularizar los ordenadores que cualquier otra persona). La vida, sin embargo, nos obliga a seguir caminos predeterminados. En el 96, cuando salí de la facultad no se me pasaba por la cabeza montar nada por mi cuenta, y fueron las circunstancias las que me obligaron años más tarde a montar mi primera empresa. Soy el único emprendedor de mis amigos de facultad, y probablemente, sea el que menos dinero gana y más tiempo dedica a su trabajo pero, oye, sarna con gusto no pica.

En fin, este no es un post para recomendaros que seais emprendedores, quizá lo que quería recordar es que para ser emprendedor hay que tener una vocación muy especial. Que no todo el mundo está preparado para los sacrificios y el alto coste personal que vas a tener que afrontar ante tu familia y amigos. Que muchas veces vas a querer tirar la toalla, rendirte ante las circunstancias y entregarte a un empleo estable, con jefe despótico y recompensas poco habituales, donde no se te pague por opinar y la proactividad te la tengas que dejar en casa. Y, finalmente, que sin el apoyo de tu pareja o hijos vas a estar muy jodido, así que piénsatelo muy bien antes de emprender un camino que puede que no te lleve a ninguna parte y que hará que propios y extraños te miren mal. Lo mio ya no tiene remedio.

Errores de gestión… Las empresas de becarios

Uno no deja nunca de aprender, sea de informática o sea de gestión, en este caso me toca hablar de una tendencia que se afianza día a día en las empresas de informática y de la que he tenido un ejemplo flagrante hace muy poco. La lección de hoy, queridos lectores, es que, nunca, nunca, nunca, hay que dejar que tu empresa sea solo un conjunto de becarios.

¿Son malos los becarios? Claro que no, seguro que en poco tiempo se convierten en unos excelentes profesionales. Con la guía adecuada, y aprendiendo de los profesionales de verdad, todos aprendemos y nos convertimos en profesionales, con poca experiencia, pero profesionales. Entonces, ¿porqué me quejo? Veamos el ejemplo.

Una startup de la que prefiero no acordarme, comenzó su andadura en un nicho de mercado en el que partía con ventaja. Sus socios eran lo mejor de lo mejor en sus áreas de experiencia. Unos provenientes de la parte académica, pero con experiencia en proyectos de investigación, otros con experiencia en el desarrollo de software a nivel profesional y un gestor que creía que sabía de todo que encontró el dinero y los inversores necesarios.

Como toda startup su obligación es focalizarse en su proyecto principal y quemar dinero hasta que consigue sacar al mercado su idea o se queda sin dinero. No obstante, por errores que no vienen al caso, la idea principal se marchitó y se lanzaron a intentar crear productos en mercados cada vez más abarrotados, donde no contaban con las ventajas anteriores y con el dinero ya mermado. En esas los socios más interesantes y menos comprometidos fueron abandonando el barco, o bien se vieron obligados a abandonar al no tener expectativas de obtener un salario digno (digo digno, no a la altura de sus méritos, que eso siempre es mucho más, pero, oye, estamos en una startup). Estas personas son reemplazadas por becarios de manera que, al final, solo queda un socio con conocimiento y experiencia y el resto que se limita a aprender lo mejor que puede intentando no romper demasiado.

Y el error principal viene cuando el gestor, en su afán por prolongar una agonía innecesaria, decide sustituir a este socio «excesivamente caro» por otras personas de un nivel muy inferior, sin capacidad de trabajo ni compromiso con la empresa pero obedientes y baratitos… El resultado, el de siempre, una mierda.

¿Puede una empresa sin conocimiento práctico, sin experiencia, sin foco y sin socios comprometidos trabajando en la misma triunfar? ¿puede acaso sobrevivir? A los ojos de quien solo mira números y no valora el trabajo real de ninguna manera es la consecuencia evidente, pongo dos por el precio de uno y gano en el cambio… ¿Ganar qué? Duplicas el numero de problemas, dilapidas el poco conocimiento que tenías y llevas a cero la confianza de los inversores en una empresa que se puede montar con cualquiera que pase por allí y que no premia ni valora experiencia ni conocimiento… En fin…

Internacionalizar una web en php

main_icoDespués de muchos meses trabajando en una aplicación que, por azares del destino, alguien decidió que se realizase en php utilizando como frontend Drupal (del que solo se utiliza el sistema de registro y poco más) y después de infinitos test de usuarios (que nunca son suficientes) y después de generar un proyecto con 31.000 líneas de código propias (el total sin contar drupal suma más de 203.000) llega el momento de venderlo.

El primer cliente siempre es el peor, pero es que el segundo ¡es holandés! y, claro, lo quiere en inglés… Y algún lumbrera le asegura que tendrán la versión en inglés ¡¡en una semana!!. Lo bonito del tema es que cuando aseguró eso no preguntó a nadie del equipo de desarrollo. ¿Para qué? Las fechas las ponen ellos, qué más da que sea algo imposible.

Total, que, de casualidad, nos enteramos de que hay que hacer este «pequeño» cambio, las traducciones no serán un problema, porque tenemos gente que puede hacerlo bien y rápido, pero, ¿cómo internacionalizamos el php? La parte que cubre Drupal (y que podría traducirse desde el mismo sistema) es mínima, en total tenemos 425 archivos php donde hay textos en castellano en cualquiera de ellos, además, parte en html, parte en php y parte en javascript… Cualquier otro programador hubiese presentado su carta de renuncia o hubiese pedido una baja laboral. Además, ya nos han dicho que no piensan pagarnos las horas extras y que si cometemos errores tendremos que arreglarlos en nuestro tiempo libre.. ¡Eso si que son condiciones laborales y no las de los mineros de asturias!

Sin embargo mi responsabilidad como profesional me obliga a atender las peticiones por absurdas que sean e intentar dar soluciones… Así que os pongo un resumen de lo que hicimos:

Problema número 1: qué sistema de internacionalización usar.

Al contrario que Java, que dispone de un sistema i18n con properties desde el principio, php adolece de este mecanismo estandar. Después de valorar varias opciones (muchas usadas en programas populares como prestashop, etc.) descubrimos que lo mejor es utilizar gettext.

Gettext es un proyecto GNU que, afortunadamente, es utilizado muy ampliamente en Linux para proporcionar internacionalización a sus programas. Es por ello que está presente en la mayoría de las distribuciones (incluyendo las que usamos para desarrollo y pruebas) y, además, tiene un módulo para php que también está normalmente incluida en las instalaciones normales de php (incluso en XAMPP está).

¿Cómo funciona gettext? Básicamente se basa en localizar todas las cadenas de texto ya escritas y sustituirlas por una función que la traduce. En el caso de php esta suele ser la función gettext(‘cadena’) o, abreviada _(‘cadena’). De esta forma, el texto en html:

<p>Esto es un texto</p>

Lo modificaremos en:

<p><?php _("Esto es un texto")?></p>

Luego el sistema localizará, según los parámetros de idioma, su traducción y la escribirá. Si no encuentra ninguna escribirá esa misma cadena.

Así que el primer, y más tedioso, problema es sustituir todas las cadenas de texto en nuestro programa por estas sustituciones. No hay una forma única y automatizada de hacerlo, porque podemos encontrarnos texto dentro del código php, dentro de etiquetas html o incluso dentro de código javascript y dependiendo de dónde se encuentre esa cadena deberá traducirse (o no).

Problema número 2: traducir las cadenas

Una vez que tenemos «marcadas» todas nuestras cadenas, deberemos generar un archivo con las traducciones… Esto ya es más sencillo de automatizar porque podemos utilizar herramientas que ya existen. La más adecuada es poedit. Esta herramienta nos permite escanear directorios de fuentes y almacena las cadenas que no están traducidas en un catálogo para después permitir que un traductor las vaya traduciendo sin tener que saber nada de php.

Antes de utilizar poedit es muy recomendable que establezcamos las rutas de los directorios donde vamos a guardar los catálogos traducidos. Generalmente esto se hace en el directorio raiz de la aplicación creando estos directorios:

locale/xx_XX/LC_MESSAGES

donde xx_XX es el código del idioma y país (en_GB en nuestro caso). Dentro de cada uno de esos directorios almacenaremos los .po (y .mo que compilamos) que generaremos con poedit.

Una vez creados los directorios, arrancamos el poedit y lo configuramos indicando que el directorio principal será «.» y los directorios a escanear serán ../../../ (suponiendo que hemos respetado la estructura que os he comentado). También es importante el tema de los plurales que, en caso del español sería:

nplurals=2; plural=n != 1;\n

Una vez todo en su lugar solo tendremos que actualizar para que poedit busque en todos los archivos y nos encuentre todas las cadenas que se pueden internacionalizar. Utilizando el mismo programa podemos hacer que los traductores nos traduzcan las cadenas y nos devuelvan el mismo .po ya traducido.

Problema número 3: hacer que el sistema use el idioma del usuario

Para que funcione gettext para php hay que incluir las siguientes líneas al principio del script:

putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale, 'english');
bindtextdomain("messages", __DIR__."/Locale");
bind_textdomain_codeset("messages", 'UTF-8');
textdomain("messages");

Lo relevante ahí es que $locale ha de contener el idioma (en_GB) messages es el nombre que tiene el catálogo poedit (así tendremos un messages.po en el directorio correspondiente) y que a bindtextdomain hay que pasarle el directorio donde hemos colocado nuestros locales.

Para el caso de drupal vamos a utilizar el idioma que el usuario ha puesto en su perfil, por lo que el código adicional a utilizar es:

global $language;
$locale = $language->language;
if ($locale=='en')
    $locale="en_GB.utf8";
else
    $locale = 'es_ES.utf8';

Esto es así porque los locales han de ser tal como están en el sistema operativo y, sin embargo, los idiomas en drupal solo indican el idioma y no el locale.

Seguimos en ello (hay muchos archivos) y además, nos queda pendiente la internacionalización de los correos y de los informes que generamos… Seguiremos informando.