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.

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:
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.