¿Cómo proteger datos sensibles en Github?

Github es una herramienta sensacional para llevar el control de versiones de nuestros proyectos y también para compartirlos y permitir que otros hagan sus contribuciones. Pero a veces hay información sensible que no queremos compartir, como contraseñas. En este artículo te muestro un método para tener a salvo esa información en tus proyectos de Micropython.

Introducción

A menudo nuestro código contiene información sensible: contraseñas de Wifi o de bases de datos, claves de servicios como Thingspeak sólo por mencionar algunos casos.

Si esta información está incluida en nuestro código (harcodeada como se suele decir) tenemos un problema, porque al compartir el código usando Github, también estamos haciendo pública esta información.

Probablemente existan varias formas de evitar este inconveniente, en lo que sigue de este artículo te muestro una manera sencilla y que da resultados efectivos.

Separa los datos

El primer paso es separar tu código de la información que no quieres compartir.

Para ello debes poner los datos sensibles en un archivo aparte e incluirlo luego usando la instrucción import.

Veamos el siguiente ejemplo en donde el programa se conecta con una red Wifi y por tanto se necesita especificar el nombre de la red y la contraseña necesaria para acceder a la misma.

Para preservar esos dos datos, crea un archivo llamado credenciales.py en el sistema de archivos de la placa con el siguiente contenido:

redWifi = "MiRedWifi"
passWifi = "12345678"

Desde luego, los datos de la red anteriores son inventados y debes reemplazarlos por los tuyos.

Luego, en el programa principal (main.py por ejemplo) debes importar el archivo credenciales.py y acceder a las variables que contiene, como se ve mas abajo en las líneas resaltadas:

#Datos sensibles
import network, time

import credenciales

red = credenciales.redWifi
pasw = credenciales.passWifi

'''
Funcion para conectar a una red Wifi
'''
def conectaWifi (red, password):
      global miRed
      miRed = network.WLAN(network.STA_IF)     
      if not miRed.isconnected():              #Si no está conectado…
          miRed.active(True)                   #activa la interface
          miRed.connect(red, password)         #Intenta conectar con la red
          print('Conectando a la red', red +"…")
          timeout = time.time ()
          while not miRed.isconnected():           #Mientras no se conecte..
              wdt.feed ()
              if (time.ticks_diff (time.time (), timeout) > 10):
                  return False
      return True


if conectaWifi (red, pasw):

    print ("Conexión exitosa!")
    print('Datos de la red (IP/netmask/gw/DNS):', miRed.ifconfig())
    
    nivelRed =miRed.status('rssi')
    print ("RSSI=",nivelRed," dBm")
    
else:
    print ("Imposible conectar")

Obviamente, no debes compartir en Github el archivo credenciales.py (al final te mostraré una forma sencilla de hacerlo).

Puede ser un poco mas prolijo almacenar estos datos sensibles o secretos en un diccionario. Para hacerlo de esta forma debes modificar credenciales.py como se ve a continuación, guardando los valores en un diccionario que para este ejemplo he llamado secretos:

secretos = { 
    'redWifi' : "MiRedWifi",
    'passWifi': "12345678"
}

Y luego en el programa principal accedes a los valores guardados en el diccionario de la siguiente forma:

#Datos sensibles
import network, time

from credenciales import secretos

red = secretos['redWifi']
pasw = secretos['passWifi']

Oculta los datos en Github

Como te decía mas arriba, el primer paso es tener la información en un archivo separado, pero si haces un push de ese archivo y se copia al repositorio remoto de Github, esta información se hará pública y todo este esfuerzo habrá sido inutil.

Para evitar esto debes utilizar el archivo .gitignore

.gitignore es un archivo especial que te permite especificar que archivo o archivos del repositorio local no serán subidos al repositorio remoto.

En este caso debes usarlo para decirle a Git que no copie credenciales.py. Para ello debes crear el archivo en la raíz del proyecto en el repositorio local y editarlo (recuerda anteponer el “.” y que no tenga ninguna extensión como .txt o .doc).

Fig. 1. El archivo .gitignore

Luego lo editas e incluyes en él el nombre de credenciales.py

Fig. 2.

Y listo!

Archivos

Primero debes crear y editar .gitignore y luego copiar al proyecto credenciales.py, de lo contrario será sincronizado en el repositorio remoto.

A partir de ahora, cada vez que sincronices tu repositorio local con el remoto, Git ignorará el archivo credenciales.py, manteniendo tus datos sensibles seguros.

Fig. 3. Repositorio remoto luego de hacer Push. No está credenciales.py

Para que otras personas que utilicen tu código publicado en Github comprendan este mecanismo, es una buena idea que incluyas algún comentario que aclare la situación:

#Datos sensibles
import network, time

'''
El nombre de la red y la contraseña se encuentran en el archivo credenciales.py
Si no está en el repositorio, debes cargar las variables red y pasw con el nombre de
tu red y tu contraseña de acceso y eliminar la siguiente línea
'''
from credenciales import secretos

red = secretos['redWifi']
pasw = secretos['passWifi']

Conclusiones

En este artículo te mostré una forma sencilla de separar las contraseñas y otra información sensible de tu código en Micropython y de que manera puedes compartir tus programas en Github sin compartir estas contraseñas haciendo uso del archivo .gitignore

Espero que esta información te haya sido de utilidad para seguir aprendiendo el uso de Micropython y aprovecharlo mejor para tus proyectos. Cualquier consulta o sugerencia puedes dejarla mas abajo en la sección de comentarios.

Nos leemos en un próximo artículo!

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Habilitar notificaciones OK No, gracias