startinfo - ¿Cómo debo resolver la seguridad de acceso a mi método en c#?
securestring example c# (4)
Estoy trabajando en un proyecto de Punto de Venta que es otorgado a nuestra compañía por un banco especial. Bank ha proporcionado una DLL que interactúa con POS a través del puerto USB. He agregado esa DLL que está escrita en lenguaje .NET C #, así que no Existen problemas de interoperabilidad. Hay un método dentro de DLL que se llama DebitAndShareTheAmount
. Este método tiene dos parámetros principales P1,P2
.
P1
es la Cantidad en texto sin formato y P2
es la cantidad que se debe restar de P1
nuevamente en texto sin formato. Por lo tanto, si llamo a DebitAndShare(1000,10);
// de hecho, en el banco acreditará mi cuenta con 1000-10 = 990 $ y la tienda que use mi aplicación de 10 $.
El problema es que cualquier persona con conocimientos básicos de programación en C # y acceso a la computadora de ese SHOP puede instalar Visual Studio y usar esa DLL y llamar al método DebitAndShare y usted sabe el resto. De hecho, nuestra aplicación actuará como proveedor de servicios y estará disponible en En las tiendas especiales de todo el país, se pagará a los propietarios de la tienda al dar servicio disponible en nuestra aplicación a los clientes y tomar su monto ($ 10). Voy a tener una reunión con los desarrolladores de POS sobre el problema de seguridad que acabo de mencionar.
He revisado el libro MCTS y en la sección de seguridad del libro, descubro que si la DLL del banco usa el atributo PublisherIdentityPermission(SecurityAction.InheritanceDemand, CertFile=@"SomeCert.cer")
antes del método DebitAndShare y marca este método como Protegido. Puede tener un nivel de seguridad, ¿verdad? ¿Cuáles son sus sugerencias? También creo que si el banco nos puede dar el enfoque de algoritmo de cifrado, entonces también será suficiente.
Como lo indican los comentarios, va a tener un problema grave para garantizar esto. Sin embargo, algunos enfoques vienen a la mente que al menos ayudarían.
Camina por la pila. En su sitio de llamadas, mire la pila actual y vuelva a subir. Si ves algo que no es lo que esperas, entonces falla. Esto no es infalible, pero detendrá a las personas que no tienen habilidades y / o pueden ver su código fuente.
Utilice un SecureString y un secreto exterior. Esto requiere que tenga algún medio para obtener un valor seguro de algún lugar. Una vez que tenga eso, puede cifrar / firmar datos para asegurarse de que no se haya manipulado (a través de certificados o algún otro mecanismo). Un depurador (a la WinDBG) aún podrá romperlo, pero con menos facilidad.
Reconstruye tu código en C ++. El código de máquina es más difícil de encontrar, pero esto no detendrá a alguien que conozca las ventanas internas.
En lugar de intentar vaciar el océano asegurando su aplicación, puede tomar una serie de medidas y luego hacer lo que hacen los bancos. Busca patrones que no tengan sentido. Si un punto de venta en particular generalmente genera valores del orden de 100, cuando ve un pedido grande o pequeño, márquelo para su revisión. ¿Un aumento repentino en las transacciones? La misma cosa.
Aparte de las soluciones técnicas, su mejor apuesta (IMHO) es asegurarse de que las tiendas estén parcialmente enganchadas por fraude. El dinero en la línea hace que las personas sean un poco más cuidadosas en cuanto a quién tiene acceso a la computadora.
Erick
Deberíamos estar utilizando la firma retrasada. La persona autorizada por el Banco despliega la dll firmada correctamente en el dispositivo. El banco lo firma con su clave privada.
Todas las llamadas a través de este serán auténticas y todas las demás son solicitudes de piratería.
Lo que estás tratando de hacer es evitar que tu aplicación sea dañada, esto es similar a un problema de licencia que enfrenté anteriormente , no tengo grandes soluciones de la comunidad, pero solo algunas buenas sugerencias, el punto aquí no importa cómo intenta, siempre y cuando estés ejecutando el código en una máquina a la que tenga acceso el usuario, siempre es susceptible, no te preocupes por la ofuscación de código, incluso el cifrado no puede proteger tu aplicación algunas veces de un cracker determinado con suficiente habilidad, y A juzgar por la rentabilidad de jugar con su aplicación, habrá muchos determinados (lo único es que necesitan saber que se puede hacer y encontrarán a alguien con la habilidad).
Puede que parezca un pesimista aquí, pero esa es la dura verdad.
Según mi criterio, el mejor enfoque sería mover las partes del código que es más probable que se descifren a un servidor central y exponer esos métodos como llamadas de servicios web . Sé que incluso esto no es completamente seguro, recuerda el reciente pirateo de la tienda de aplicaciones de Apple . Asegúrese de haber seguido todas las mejores prácticas y espere que encuentre un crack en su sistema antes de que alguien más lo haga.
Podría tenerlo para que la función acepte algo como su pin, de modo que la función llame a la base de datos del banco para verificar que su pin sea correcto. De esa manera, al menos si alguien tiene acceso, primero tendrán que deshabilitar el argumento de pin.
También puede seguir el enfoque de Gabe y hacer que el sistema asigne la cuenta a un dispositivo y hacer que la función solo sea accesible desde un dispositivo registrado. Además, quizás lo haga para que el código fuente no se almacene en una computadora bancaria, sino en un dispositivo de almacenamiento en una caja de seguridad / bóveda bancaria. Entonces la persona realmente tiene que robar el banco para conseguirlo. Como medida doble, cifre / establezca una contraseña para el dispositivo de modo que solo el algoritmo de descifrado (en el sistema del banco, por lo que es poco probable que los ladrones retrocedan) o la contraseña conocida pueda extraer el código fuente.
Si eso no funciona, no tengo más ideas sensatas (a menos que mantener la fuente en la papelera de reciclaje o bloquear la fuente en un búnker nuclear sea lo más sensato).