2 votos

Hacer que el contenido del shell script sea difícil de leer

Estoy preparando una experiencia similar a una sala de escape para un grupo de niños de 11 y 12 años. Como parte de la actividad, voy a configurar un viejo Mac (probablemente con Snow Leopard) con una cuenta de usuario especialmente creada. El escritorio contendrá un shell interactivo y ejecutable script que pedirá a los niños que introduzcan una serie de "contraseñas" para obtener el código de una caja fuerte.

Me preocupa un poco que algún niño emprendedor se dé cuenta de que puede abrir el script en un editor de texto y simplemente leer todas las contraseñas. Hacer que la cuenta arranque directamente en una consola podría ayudar, pero prefiero no hacer eso, y todavía hay un riesgo de que alguien sepa la nano comando.

¿Cómo puedo hacer que este script sea lo más difícil de leer posible?

0 votos

Si a alguien se le ocurre un título mejor para la pregunta, no dude en sugerirlo. En realidad, no tendréis ni idea de lo que pido hasta que leáis el post.

0 votos

Esto puede ser útil/relevante: unix.stackexchange.com/questions/34202/

0 votos

4voto

Nate Puntos 220

Opción 1: utilizar el shell scriptcompilador para convertir el script en un ejecutable binario. El binario seguirá conteniendo el script (de forma muy oscura), pero a diferencia de un script normal, puedes establecer los permisos del archivo para que la cuenta que los niños están usando no tenga acceso de lectura a él (sólo de ejecución).

Opción 2: Encriptar el código seguro usando las "contraseñas", almacenar el código encriptado en el script, y usar lo que los niños introduzcan para desencriptarlo. Aquí hay un proceso de encriptación que podrías usar con tres contraseñas, "sekrit1", "hunter2", y "p4ssw0rd3":

$ echo '12 left, 25 right, 9 left' | openssl enc -aes256 -base64 -pass "pass:sekrit1|hunter2|p4ssw0rd3"
U2FsdGVkX18IFQAaSjEv2AJJ16z6wjROjcHiqHWGvji3MEsmcHwPgu3MQeh2O+c1

Luego en el script:

read -p "Enter the first password: " pass1
read -p "Enter the second password: " pass2
read -p "Enter the third password: " pass3
encrypted="U2FsdGVkX18IFQAaSjEv2AJJ16z6wjROjcHiqHWGvji3MEsmcHwPgu3MQeh2O+c1"
if result=$(echo "$encrypted" | openssl enc -d -aes256 -base64 -pass "pass:$pass1|$pass2|$pass3" 2>/dev/null); then
    echo "The safe combination is $result"
else
    echo "At least one password is wrong!"
fi

Si quieres dar a los niños información contraseña por contraseña, podrías añadir la comprobación de los hashes de las contraseñas a medida que se introducen:

$ echo "sekrit1" | shasum
b19fb68c28bff07cf8fcc7c53ab48c5d6f41e993  -

En script:

read -p "Enter the first password: " pass1
if [ "$(echo "$pass1" | shasum)" = "b19fb68c28bff07cf8fcc7c53ab48c5d6f41e993  -" ]; then
        echo "Correct so far..."
else
        echo "Wrong!"
        exit
fi
...etc

Por cierto, esta no es una forma realmente segura de almacenar contraseñas; los hashes de contraseñas seguros adecuados están diseñados para ser lentos y utilizar "sal". Pero esto debería ser lo suficientemente seguro para algunos niños.

0 votos

Gracias. Lo de shasum es genial, aunque creo que tendré que usar ese compilador... aunque las respuestas de las contraseñas no sean visibles, la salida al final del script sí lo es.

1 votos

@Wowfunhappy Si encriptas toda la salida final (con openssl enc ), debería poder evitar ese problema. Ten en cuenta que es totalmente posible encriptar múltiples cadenas (bits de salida, avisos, etc.) con la(s) misma(s) contraseña(s). Si es la lógica real del programa la que necesita ser ocultada, eso es más complicado.

0voto

Puede utilizar Ornitorrinco para envolver el script en una aplicación que sería difícil de leer.

Descargo de responsabilidad: Soy un usuario satisfecho de Platypus y no tengo ninguna relación financiera o de otro tipo con Sveinbjorn.org.

0 votos

Lamentablemente, esto no parece funcionar con un script interactivo. ¡Los niños no podrán introducir las contraseñas!

0 votos

Dang. De Sveinbjorn.org: User interaction with CocoaDialog -- Platypus apps may be able to use CocoaDialog to construct scripts that prompt for user input with dialogs. As of writing, the CocoaDialog project seems to be dead. CocoaDialog está disponible en github pero puede que no funcione. Perdón por el aparente callejón sin salida.

0voto

Wowfunhappy Puntos 33

Al final me he decantado por este programa de node que ofusca los bash scripts: https://www.npmjs.com/package/bash-obfuscate . Utilicé pkg para convertir el programa en un ejecutable binario estático que podré ejecutar en cualquier ordenador Mac. Aunque la ofuscación no es perfecta, debería ser más que suficiente para mi joven público.


Respuesta de Gordon Davisson es fuerte y probablemente funcionará para otros que se encuentren con esta pregunta. Sin embargo, tengo algunas preocupaciones para mi caso de uso específico. Tengo previsto modificar estas "contraseñas" poco antes de ejecutar la actividad, para que se adapten a mi entorno y a mi público. Necesito que este proceso sea rápido y no sea propenso a errores. Así:

  1. SHC, que compila shell scripts a ejecutables binarios, requiere que un entorno de desarrollo adecuado con gcc esté instalado en la máquina. No estoy seguro de qué máquina voy a usar cuando configure esto, así que quiero evitar este requisito.

  2. Modificar el script para utilizar contraseñas encriptadas -y encriptar la salida que se muestra una vez introducidas todas las contraseñas- sería un proceso manual, que tendría que rehacer cuando cambiara las contraseñas. Y tendría que volver a probar el script encriptado después de cada cambio, para asegurarme de que no he estropeado nada.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X