¿Cuál es la mejor manera de asegurarle al usuario que el código que se ejecuta en el backend es el mismo que se anunció?

De lo que estás hablando se llama computación verificable

El artículo de Wikipedia anterior enumera dos opciones:

Verificación por replicación

Si el usuario también puede ejecutar el software y verificar que los resultados son los mismos, es posible que no sepan si el software que está ejecutando es el mismo, pero al menos sabrán que produce los mismos resultados , que a menudo es ” suficientemente bueno “en la práctica.

Por ejemplo, si estaba ejecutando un sitio de apuestas en línea, podría generar todos sus números aleatorios por adelantado, en un archivo por día, luego tomar el hash SHA-256 de esos archivos y publicarlos en una red blockchain como Bitcoin o Ethereum: luego, cuando termina cada día, simplemente publica los archivos que contienen los números, y todos pueden usarlos para verificar que los ganadores fueron elegidos correctamente (comparando el hash del archivo con el que se recuerda en la cadena de bloques, para que sepan no solo cambió el archivo, y luego ejecutó la parte del algoritmo de selección del ganador con esos números como entradas).

Cifrado homomórfico

Wikipedia dice:

El cifrado homomórfico es una forma de cifrado que permite realizar cálculos en texto cifrado, generando así un resultado cifrado que, cuando se descifra, coincide con el resultado de las operaciones realizadas en el texto sin formato.

Para su caso específicamente, el cálculo que se está llevando a cabo puede ser la simulación de un circuito, de modo que el usuario simplemente envíe el programa encriptado a su servidor, y su servidor simplemente realice el trabajo sin siquiera saber lo que está haciendo. No puede enviar resultados falsos porque incluso si puede adivinar qué programa están ejecutando, no podrá codificar la respuesta de la manera correcta para que el usuario la lea correctamente.

La advertencia es que lo anterior es material de “borde sangriento”; no solo encontrará una biblioteca que lo haga por usted, y requiere toneladas de potencia computacional (sobre eso, lo más positivo que puede encontrar en los artículos es que “no es una causa perdida”, y que la primera implementación de algo así necesitaba una operación de 30 minutos por bit).

Notas al pie:

¹ En realidad, así es como funcionan los sitios de juego de Bitcoin como Satoshi Dice: se autodenominan “demostrablemente justos”, porque es fácil demostrar que no hicieron trampa.

La mejor manera de demostrar que su software es ‘a prueba de balas’ es con una unidad copiosa y pruebas funcionales programadas, junto con un sistema de seguimiento de tickets que muestra cómo llegó allí.

El hecho es que el hecho de que esté seguro de que su código es perfecto no prueba que sea perfecto, solo demuestra que está seguro. Podría mostrar que estás demasiado confiado. Los artefactos, como las pruebas unitarias con secuencias de comandos, muestran cuáles son los casos extremos de su software y cómo reaccionará. Los artefactos, como las pruebas funcionales programadas, muestran cómo espera que los usuarios usen su software. Los artefactos como los sistemas de seguimiento de tickets muestran que no preparó los escenarios de los usuarios en el vacío, sino que respondió a las necesidades del cliente.

El problema con todas estas herramientas es que no se trata del problema. Se trata de lo que no está allí. ¿Las pruebas de su unidad pierden el caso límite que le permite a un hacker obtener acceso sin restricciones? ¿Su prueba funcional no cubre un escenario en el que sus clientes podrían hacer un uso intensivo? ¿Su sistema de seguimiento de tickets no incluye la función que esperan sus clientes?

Por supuesto, si es de código abierto, siempre puedes ingresar al código y descubrirlo por ti mismo. Ahí es donde entra la documentación real del desarrollador. Si no ha documentado su código con comentarios y otra documentación, el nivel básico de experiencia requerido para hacer uso de él aumenta. Si ya ha terminado, es casi demasiado tarde para agregar pruebas unitarias con guiones, pruebas funcionales con guiones y tickets que documenten su progreso. Como mínimo, puede agregar documentación que actuará como publicaciones de guía para desenredar su proyecto.

Sin embargo, si no ha llegado a los otros tres, tal vez sea hora de aprovechar la experiencia que obtuvo de su proyecto de código abierto actual e implementarlo de la manera en que lo implementaría ahora si no tuviera todos estos malditos usuarios. Te sorprendería con qué frecuencia estas cosas se reescriben desde cero solo para estar a la moda.

[T] el usuario no puede tener que confiar en mí para asegurarse de que el sitio web en el que se encuentra ejecuta mi código. ¿Cuál es la mejor manera de asegurarles eso?

Realmente no hay uno. ¿Por qué no se puede exigir a los usuarios que confíen en que un sitio ejecuta su código? La respuesta a eso podría ayudar a revelar algunas estrategias a medio camino que al menos podrían acercarse a satisfacer sus necesidades, mientras que en realidad son alcanzables.

Verificación binaria (asegurarse de que un programa ejecutable en su propia máquina se corresponde con el supuesto código fuente) ya es un problema extremadamente difícil. ¿Verificando la correspondencia del código fuente para el código que se ejecuta en la máquina de otra persona (en este caso, un servidor web)? No va a suceder con la tecnología actual. Si puede resolverlo, es muy posible que obtenga una medalla Fields o un Premio Turing.

EDITAR:

Como Vladislav Zorov ha señalado útilmente en los comentarios, en realidad hay una forma de hacerlo … pero probablemente no sea una que sea realmente práctica para que usted implemente, o que sea aceptable para sus usuarios.

La solución conocida es utilizar una construcción de circuito Garbled, donde el administrador del sitio web no tiene el código de fondo almacenado en el servidor. En cambio, el único código que se ejecuta de forma nativa en el servidor sería un sistema de cifrado homomórfico capaz de interpretar el código cifrado, y tal vez un servidor web estático trivial para servir una página de inicio con una implementación de JavaScript del sistema de cifrado. Sus usuarios deberán cargar una forma encriptada de su código fuente (o un ejecutable compilado verificable) ellos mismos en cada sesión, para que puedan inspeccionarlo personalmente y asegurarse de que es el código que han enviado. (Esto, por supuesto, también tendría lugar idealmente a través de una conexión TLS segura).

Si puede encontrar una manera de hacer que este tipo de cosas no tarde días o semanas en ejecutarse, y que sea lo suficientemente fácil de usar para que el usuario promedio del sitio web pueda completar con éxito el protocolo, todavía creo que hay una buena posibilidad de un Fields medalla o Premio Turing en su futuro.