Firma digital con RSA y Dart aplicable a Flutter

Firma digital con Dart y RSA

El día de hoy vamos a ver cómo firmar un mensaje de manera digital con Dart. Al hacerlo con Dart vamos a poder aplicar esto con Flutter más adelante, y así podremos firmar digitalmente en Android y cualquier otra plataforma soportada por Dart.

Firma digital con RSA y Dart aplicable a Flutter
Firma digital con RSA y Dart aplicable a Flutter

Recuerda que vamos a necesitar un par de claves: la privada y la pública. Ambas necesitan funcionar con la encriptación RSA.

Por cierto, toma en cuenta que vamos a firmar, no a encriptar. Lo que vamos a hacer es verificar la autenticidad de un mensaje, pero no vamos a esconder ni proteger nada.

Generando claves

Puedes generar las RSA keys de la manera que tú prefieras aunque yo recomiendo OpenSSL:

Generar par de claves RSA con OpenSSL (privada y pública)

Vamos a firmar con la privada y después verificaremos con la pública. Todo esto en Dart que más adelante, si es que quieres, se puede aplicar a Flutter.

Importando encrypt

Para firmar con RSA en Dart necesitamos el paquete encrypt.

Dependiendo si usar flutter o dart se importa de distinta manera pero en el enlace que dejé anteriormente está la guía de instalación. En mi caso solo lo usaré en dart así que ejecuto:

dart pub add encrypt

Solo como ejemplo, mi pubspec.yaml queda así:

Nota: fíjate en dependencies.

Firma digital con RSA y Dart

Comencemos viendo cómo firmar. Para esto importamos el paquete que agregamos previamente, creamos una nueva instancia de Signer pasándole un RSASigner con la clave privada y después invocamos a sign.

Este método devolverá el mensaje firmado, codificado como base64 (estamos accediendo a base64 de la clase Encrypted, pero podemos acceder a bytes, base16, etcétera).

La función recibe la clave privada RSA y el mensaje original que queremos firmar.

Toma en cuenta que una cosa es la clave como String (la que definimos nosotros y generamos con OpenSSL) y otra cosa es la clave RSAAsymmetricKey que se genera al invocar a parse en la línea 2.

Por cierto, estamos codificando el mensaje firmado en base64. Al verificar el mensaje primero tendremos que decodificar.

Verificar firma con Dart

Ya hemos visto cómo firmar un mensaje, ahora falta comprobar que ese mensaje fue firmado con la clave privada usando la clave pública; es decir, que es auténtico.

El método queda así:

En la línea 3 creamos la clave pública que será de tipo RSAAsymmetricKey igual que lo hicimos al firmar, pero ahora es para la clave pública.

La verdadera comprobación está en la línea 6. Ahí invocamos a verify64 pasándole el mensaje original y el mensaje firmado.

Recuerda que el firmado está en base64 porque así lo devolvemos al firmar.

Poniendo todo junto

Veamos el ejemplo completo. Yo he dejado ahí ambas claves RSA para firmar con Dart y Flutter, pero recuerda que en la vida real solo debes distribuir la pública para verificar la firma, y mantener la privada cuando firmes.

El ejemplo de código está en el método main en la línea 54. Obviamente tú puedes mejorar y separar estos métodos que ves y usarlos como prefieras.

Nota: yo he ejecutado el programa con dart run firmar.dart. También se puede compilar y todo eso.

Te repito que esto se puede integrar directamente a Flutter y usarlo en otras plataformas. Así podrás verificar firmas digitales con Dart en varios lugares.

Esto de la firma digital con RSA también lo he hecho en Golang. Y antes de que lo olvide: nunca compartas tu clave privada. Yo lo hago porque estoy ejemplificando y no la usaré en otro lugar.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario