Verificación de descargas usando hashes

Un hash es un número muy grande que identifica a una única secuencia de bytes (que pueden ser uno o varios caracteres, o el contenido de todo un fichero). Si cambias un solo byte en la secuencia, su hash será completamente distinto. Debido a esto, podemos usarlo para verificar si has descargado correctamente un fichero de Internet.

Hay varias funciones que general en hash de una secuencia de bytes (o de un fichero). En esta nota, mostraremos cómo obtener dos de ellas: MD5 y SHA256.

Cómo validar una descarga

La mayoría de sitios donde descargas un fichero muestran el hash MD5 o SHA256 del mismo.

Una vez descargado el fichero, debes ejecutar un comando para obtener el hash del fichero descargado. Si el número resultante (mostrado en hexadecimal) es igual al que está listado en el sitio web, entonces tu descarga ha sido correcta.

Ya que el número resultante es muy grande (en especial con el algoritmo SHA256), usualmente basta comparar los primeros 8 y/o los últimos 8 dígitos del hash.

Cómo obtener el hash de un fichero descargado

Nota: Asumiremos que has descargado un fichero llamado fichero-descarga.zip y este fue grabado en la carpeta o directorio por defecto donde se guardan las descargas dentro de la carpeta del usuario.

Al ejecutar los comandos, cambia fichero-descarga.zip por el nombre fichero que quieres comprobar su hash, y si lo has descargado en otra carpeta, también cambia Downloads.

En Microsoft Windows 10 o superior

  1. En el menú inicia PowerShell. Puedes buscar el comando:

2. En la ventana de Windows PowerShell escribe el siguiente comando, seguido de la tecla Enter:

Get-FileHash Downloads\fichero-descarga.zip

Nota: Recuerda cambiar la carpeta y el nombre del fichero por el correcto.

3. El comando mostrará el hash SHA256:

4. Para obtener el hash MD5, ejecuta el siguiente comando:

Get-FileHash -Algorithm md5 Downloads\fichero-descarga.zip

En Linux/Mac

En Linux, la mayoría de distros renombran el directorio de descargas a Descargas cuando lo instalas en español.

En Mac, el directorio se llama siempre Downloads.

  1. Ejecuta un terminal, llamado ‘Terminal’, ‘Emulador de Terminal’
  2. En el terminal ejecuta el siguiente comando:
sha256sum Descargas/fichero-descarga.zip

3. El comando mostrará el hash SHA256:

4. Para obtener el hash MD5, ejecuta el siguiente comando:

md5sum Descargas/fichero-descarga.zip

Nuevo administrador de equipos bloqueados

Los servidores de alojamiento web de IcaServer poseen un mecanismo de seguridad para evitar el acceso a sus servicios (como cPanel, envio y recepción de correos, etc) usando «fuerza bruta» para adivinar la contraseña, mecanismo usado por bots y malware para realizar acciones dañinas: Si alguien (o algo) intenta ingresar con una contraseñas erradas 10 veces, el servidor bloqueará totalmente el acceso de dicho equipo o red al servidor afectado.

Qué hacer si mi equipo fue bloqueado

Si sospechas que tu equipo ha sido bloqueado (no puedes ingresar a tu correo, cPanel, o web), ingresa al Panel de Clientes. Al ingresar, si tu equipo está bloqueado, te aparecerá un aviso en la parte superior con un enlace para que obtengas mayor información al respecto.

Si el equipo que sospechas que ha sido bloqueado no es el tuyo, primero obtén la dirección IP pública de él, ingresando (desde ese equipo) a https://ip.x10.pe (u otro servicio de obtención de IP pública), luego en el Panel de Clientes ingresa al apartado Alojamientos web, y elije la opción Equipos bloqueados. En esa página, escribe el IP a verificar, y dale clic al botón «Consultar bloqueo de IP».

En ambos casos aparecerá información sobre el bloqueo:

Pantalla de información de un equipo bloqueado

Antes de solicitar el desbloqueo, asegúrate de haber resuelto el problema que lo causó (un cliente de correo mal configurado, alguien accediendo a una cuenta de FTP con una contraseña errada, etc. En el ejemplo, fue un problema de contraseña en el envío de correo). Solo tienes una cantidad limitada de veces que puedes solicitar el desbloqueo de un IP.

Actualización 202107 de la API de facturación

Nueva forma de envío de CPE de prueba.

Ahora, para poder enviar comprobantes de prueba, puedes usar la URL https://api-testing.facturaselectronicas.biz. De esta forma puedes probar el mismo listado de propiedades en pruebas como en producción. Los comprobantes enviados a esta nueva URL serán inmediatamente enviados a la SUNAT, por lo que podrás comprobar también si pasó su verificación.

Para esto, la propiedad modo_prueba ha sido removida, y su uso generará un error.

Cabeceras HTTP más estándares en la petición a la API.

Para definir el formato de comunicación, ahora se usa la cabecera HTTP «Content-Type«, que puede tener dos valores:

  • text/plain, para usar el formato ‘texto’.
  • application/json, para usar JSON.

El token ahora se envía usando la cabecera HTTP «Authorization«, con el prefijo «Bearer«, seguido de un espacio, seguido del token de seguridad. E.g.:

Authorization: Bearer 1b4b3e18f9b03a483be11aa1aa756ec349467404ba91d0de1f1ec93402234066

Las cabeceras anteriores con sus valores (i.e. «x-token» y «x-formato«) aún siguen siendo válidas.

Mejoras en códigos de errores

Los errores han sido uniformizados. Ahora, todo error devuelve siempre cuatro variables:

  1. estado, con el valor «error«.
  2. codigo_error, con un nombre fijo que identifica al error.
  3. descripcion_error, con una explicación del error. Y
  4. descripcion_extra, con información particular sobre lo que causó el error. Puede tener un valor vacío.

El error será devuelto en el formato que se solicitó en la petición HTTP, salvo que el error suceda al muy inicio de la validación, cuando aun no se ha procesado el formato (e.g. cuando la conexión se realiza por otro verbo HTTP distinto a POST, o el formato consignado es erróneo). En dicho caso, la información siempre será devuelta en JSON.

Los errores han sido divididos en 5 categorías, cada uno con un código HTTP:

  • 400: Errores de sintaxis o valores incorrectos en las propiedades enviadas.
  • 403: Errores de autorización, como UUID o token inválido.
  • 405: Cuando hay una conexión que no es por HTTP POST. El formato de la respuesta a este error siempre será JSON.
  • 406: Errores en los parámetros iniciales de la conexión, o en la configuración de la cuenta. E.g. formato desconocido, envío de comprobante a la URL de producción cuando la cuenta aun no ha sido pasada a producción, etc.
  • 500: Ha sucedido un error inesperado. El administrador del sistema ya habrá sido advertido. Si te comunicas con nosotros, por favor pásanos el valor de descripcion_extra, para poder facilitar la búsqueda de la causa del problema.

Si la operación sucedió correctamente, el código HTTP será 200.

Cambios en los parámetros de la API

  • Emitir:
    • La propiedad bolsa_plastico ha sido marcada como obsoleta, y debes evitar usarla. Ahora está la propiedad total_icbper para la suma de todos los impuestos, y la propiedad icbper dentro de cada ítem, para consignar el impuesto en cada producto gravado, de forma similar a las propiedades total_igv e igv, respectivamente.
    • Debido a un cambio en la entrega de comprobantes a la SUNAT, los ceros a la izquierda en el valor de la propiedad numero ahora serán removidos.
  • Todos:
    • Como indica el primer apartado, la propiedad modo_prueba ha sido removida, y fallará con un error al ser usada.

Corrección de errores internos

  • Hemos reparado un error que no colocaba el Content-Type correcto a la respuesta (siempre respondía con valor text/html).
  • Ahora la SUNAT no genera una observación si no se especifica la propiedad opcional codigo de un ítem.

Actualización 202104 de la API de facturación

Envío inmediato para pruebas de integración.

Los CPEs enviados desde cuentas en modo «integración» o con la propiedad modo_prueba activa serán siempre enviados inmediatamente a los servidores de prueba de la SUNAT, y en la respuesta de la API estará la información devuelta por SUNAT en tres campos: sunat_respuesta, sunat_descripcion, y sunat_observacion.

Los CPE enviados en modo «producción» siempre serán enviados en diferido. Por ello, la propiedad envio_inmediato ha sido eliminada.

Mensajes de correo con observaciones.

Ahora recibirás por correo electrónico las observaciones que la SUNAT informe de los CPEs que han sido aceptados. Estas observaciones no invalidan el CPE, pero pueden informar de ciertas inconsistencias, e.g. un tributo con un valor incorrecto.

Nuevos códigos HTTP para errores.

Cuando la API encuentre un error en los parámetros enviados, devolverá un error HTTP 400, con el detalle del error en el cuerpo de la respuesta, en el mismo formato especificado por la cabecera X-FORMATO de la solicitud.

Si el error sucede en el inicio de la conexión (e.g. cuando una cuenta está suspendida, o el token es inválido), devolverá un error HTTP 406.

Nuevos valores de tipo_nota para notas de crédito.

Para cumplir con los nuevos requisitos del RS 193-2020/SUNAT, estos nuevos valores son aceptados para la propiedad tipo_nota:

  • 10: Otros conceptos
  • 11: Ajustes de operaciones de exportación
  • 12: Ajustes afectos al IVAP
  • 13: Corrección del monto neto pendiente de pago y/o la(s) fechas(s) de vencimiento del pago único o de las cuotas y/o los montos correspondientes a cada cuota, de ser el caso.

Forma de pago para facturas y sus notas.

Para cumplir con los nuevos requisitos del RS 193-2020/SUNAT, debes consignar en las facturas o sus notas la información de la forma de pago usando tres nuevas propiedades: forma_pago, monto_pendiente, y cuota.

Si omites estas propiedades, la API usará el valor «contado» para forma_pago.

Depuración de CPEs pasado el tiempo de almacenamiento.

Si tienes CPEs que han pasado su tiempo de almacenamiento (usualmente 2 años), estarás recibiendo en las próximas semanas, y desde ese momento mensualmente, un correo electrónico con un enlace para descargarlos, y así puedas archivarlos por tu cuenta.

Mejoras en el análisis de los parámetros recibidos

Hemos mejorado algunos aspectos del análisis de los parámetros, para mejorar la comunicación con la API.

  • La API rechazará parámetros inválidos, lo cual evitará errores de escritura (conocidos como typos).
  • Las propiedades que son colecciones puedes escribirlas tanto en singular como en plural. E.g. leyenda o leyendas, item o items. En singular se ve mejor cuando usas el formato texto, y en plural cuando usas el formato json.
  • Puedes escribir con ortografía correcta el nombre de todas las propiedades, como número, ítem o código_detracción. Los nombres sin tilde siguen siendo válidos.

¡Bienvenidos a IcaServer 6.0!

Aunque ya hemos publicado varios elementos de esta nueva versión hace varios meses, hoy es el lanzamiento oficial. 😅

¡Mira y comparte el vídeo de presentación!

¿Y qué hay de nuevo? ¡Empecemos a enumerar!

Nuevos precios. Nuevamente, esto ya ha estado en efecto hace varios meses 😅 Hemos desaparecido el concepto de ‘planes de alojamiento’, ahora solo se mide por el espacio de almacenamiento. Ya no hay medición de transferencia mensual, y todos los recursos (como bases de datos y cuentas de correo) son ilimitados. Los detalles exactos de esto lo publicaremos en nuestra futura base de conocimientos.

Panel de Clientes. Ahora la administración y registro de los servicios son automatizados, y puedes pagarlos usando cualquier tarjeta de débito o crédito peruana, de cualquier marca y banco. También aceptamos transferencias entre cuentas del BCP, y usamos la constancia de transferencia que envía el aplicativo del banco para automatizar el proceso.

Visita el Panel de Clientes en la web https://clientes.icaserver.com.

Más de 200 extensiones de dominios. Y de vez en cuando añadiremos más y más. Dale un nombre más expresivo a tu dominio con extensiones como .dev, .cafe, .srl, .ninja, .pub, y otras, que puedes encontrar en https://icaserver.com/dominios.

Nuevo diseño. Minimalista, más estilizado y elegante. 😌


Por varios problemas no pudimos activar el servicio de servidores privados virtuales 😔 pero estamos trabajando en ello, y lo tendremos listo y funcionando en los siguientes días.

Sobre el incremento de precios de cPanel

cPanel es el administrador de facto para alojamientos web, y es el que IcaServer ha usado desde su inicio. Es un excelente programa: fácil de usar, intuitivo, y muy completo, con excelente herramientas para nosotros como administradores del sistema, y para nuestros clientes. Con gusto pagábamos su tarifa fija mensual.

Pero en julio del 2019, cPanel anunció que dejaría su tarifa fija, para pasar a una tarifa basada en el número de usuarios que tiene un determinado servidor. Esta ha sido una decisión mal vista en el mundo del alojamiento web, ya que irrumpe en la forma de trabajar de las empresas que distribuyen cPanel, y en las empresas que alquilan alojamiento web:

  • Las empresas distribuidoras de cPanel tendrán que cambiar su mecanismo de venta (o dejar de distribuirlo, como algunas ya han optado), pues estas no tienen forma de saber cuántos usuarios tienen los servidores de sus clientes.
  • La nueva tarifa devendrá en un incremento del precio de alquiler de cada cuenta de alojamiento web para el usuario final.

Actualmente estamos esperando información de nuestro distribuidor de cPanel para poder establecer los nuevos precios, que estaremos comunicando oportunamente a nuestros clientes.

¿O quizás podemos ofrecer un Alojamiento Web Profesional sin cPanel, con otro administrador de alojamiento web? Hay varias alternativas, pero ninguna nos ha llamado la atención. Existe también la alternativa de empezar un desarrollo propio de un administrador de alojamiento web open source. 😃 ¿Por qué no? Por algo somos desarrolladores 🤓 Y definitivamente estará publicado en https://github.com/paperclip-eirl 😁

Nueva regla para forzar HTTPS

Desde hace casi dos años, todos las cuentas de Alojamiento Web de IcaServer tienen instaladas un certificado SSL/TLS para encriptar las comunicaciones entre dichas cuentas, y los clientes que las visitan.

Ya que los navegadores, por defecto, siempre acceden a un sitio web mediante el protocolo inseguro, habíamos colocado una redirección en el fichero .htaccess , de tal manera que el navegador -al acceder al sitio web- primero recibía la instrucción de recargar el mismo sitio web, pero usando HTTPS.

Esto presenta algunos problemas: Primero: está el tema del doble acceso al sitio web (el primero en HTTP, luego la redirección con HTTPS). Y segundo (y más importante): Es posible que alguien (o algo) capture el primer acceso (ya que sucede en un canal inseguro), para lograr algún tipo de ataque.

Por ello, a partir de la ahora, las nuevas cuentas de Alojamiento Web de IcaServer tendrán un fichero .htaccess con mayor seguridad:

# BEGIN HTTPS
# Estas líneas indicará al navegador web que siempre acceda a esta cuenta 
# de alojamineto web via HTTPS

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Header always set Strict-Transport-Security "max-age=7776000; includeSubDomains"

# END HTTPS

En vez de usar constantemente una redirección hacia una conexión HTTPS, ahora activaremos el HTTP con seguridad de transporte estricta a las nuevas cuentas. Con esto, le indicamos al navegador web que siempre cargue el sitio web vía HTTPS (por ello se llama ‘estricta’), y con esto evitamos el doble acceso (ahora solo sucederá una única vez, la primera vez que un navegador web accede al sitio web).

Como seguridad adicional, los navegadores web recordarán esta directiva aunque sea removida (muchas veces por accidente) del fichero .htaccess por aproximadamente 3 meses, que es el tiempo de validez del certificado SSL/TLS autoinstalado (el cual se renueva automáticamente al vencerse). No usamos el tiempo común de un año, por si en un caso muy extraño alguno de nuestros clientes decida migrar su cuenta de alojamiento web a otro proveedor y no desee usar HTTPS ahí, por alguna razón…

Eventualmente cambiaremos esa fecha a un año en las nuevas cuentas. Cambiarlo es sencillo, solo deben de modificar el valor de max-age a 31536000 (un año no bisiesto, especificado en segundos).

Este nuevo fichero .htaccess solo será colocado automáticamente en las nuevas cuentas. En las cuentas ya creadas, deberán de añadir (o crear)  a su fichero .htaccess el contenido arriba descrito (pueden ignorar las líneas que empiezan con una almohadilla, «#»).

Invitación al FLISOL 2018

Software usado: C con SDL en Xubuntu Linux 16.04

Después de varios años volví a realizar la invitación para la sede del FLISOL en Ica, organizada por Icanux, pero después de haber hecho varios vídeos en Blender (2012, 2013 y 2014), decidí hacer un programa que genere en tiempo real las imágenes y animaciones.

El binario para Linux lo pueden descargar de aquí:

https://icanux.org/static/invitacion-flisol-2018.tar.xz
(SHA1 0e928980d18904e896c052e5a28c4e8bf4bb0f50).

Más información, en mi blog personal.

Revitalización de software de MS-DOS

Software usado: QuickBASIC 4.5 y DOSBox en Xubuntu Linux 16.04

A pedido de nuestro cliente,  encontramos la manera de ejecutar un software hecho para MS-DOS de Windows 98 en equipos modernos. Creamos un wrapper en QuickBASIC para emular las funciones específicas que el programa requería de dicha versión de MS-DOS, e instalarlo dentro de DOSBox en Xubuntu Linux.

Efecto ‘rotozoomer’ en Raspberry Pi B+

Software usado: Lenguaje de programación C sobre Raspbian en Raspberry Pi B+

Este experimento escribe directo los bytes sobre la memoria de vídeo del Raspberry Pi, sin usar la aceleración por hardware (usando el framebuffer de Linux). El programa se ejecuta a aprox. 24 cuadros por segundo en una resolución de 720p. Debido a los bajos recursos del equipo (Procesador de 700 MHz con 512MB de RAM), usamos varias técnicas de optimización, como minimizar el uso de estructuras `if` y las llamadas a funciones (el cambio de scope toma bastante tiempo).

El código fuente está disponible en GitHub.