Red de conocimiento informático - Aprendizaje de programación - Protección del código fuente del proyecto de nodo

Protección del código fuente del proyecto de nodo

El uso de productos electrónicos para desarrollar programas de escritorio parece ser la primera opción para que los desarrolladores de aplicaciones para el usuario WEB desarrollen programas de escritorio. Recientemente, han existido algunos requisitos para el uso de cerraduras de cifrado en productos electrónicos. Aprendimos a llamar a la biblioteca de enlaces dinámicos en Node.js a través del módulo FFI-Pina y utilizamos javascript para encapsular las bibliotecas dinámicas de varios productos de bloqueo de cifrado, logrando así la función de utilizar bloqueos de cifrado en la electrónica.

Durante el proceso de desarrollo, encontramos algunos problemas y algunas trampas. Resumámoslo a continuación y registrémoslo aquí. Aquí utilizamos la biblioteca de enlaces dinámicos de ROCKEY-ARM con parámetros de funciones de interfaz complejos para el desarrollo.

Nota: He compartido el código fuente del módulo de interfaz ROCKEY-ARM encapsulado en JavaScript. Si solo necesita usar ROCKEY-ARM en proyectos electron o Node.js, puede usarlo directamente.

Primero, necesitas instalar los módulos FFI-NAPI, REF-NAPI, REF-Array-NAPI y REF-Struct-NAPI en tu proyecto node.js.

La siguiente es una breve introducción a los usos de estos módulos:

Si compra el producto de bloqueo de cifrado ROCKEY-ARM de Tianfei Chengxin, puede obtener el SDK de ROCKEY-ARM y Windows y Biblioteca de enlaces dinámicos de Linux. Los nombres de los archivos son generalmente dongle_d y libRockeyARM.so.0.3.

FFI-Pina es compatible con los sistemas Windows y Linux, por lo que ambos son compatibles. dll y . Entonces se puede apoyar. Simplemente cargue diferentes archivos de biblioteca dinámica en diferentes sistemas operativos. El método para cargar una biblioteca dinámica es el siguiente:

El primer parámetro de la biblioteca() es la ruta. dll, y la ruta del sistema Linux es. entonces. El segundo parámetro rockeyInterface es la declaración de la función exportada de la biblioteca dinámica. Hay muchas funciones exportadas de ROCKEY-ARM, así que las definí por separado. Los detalles se mencionan a continuación.

Primero busca algunas funciones con parámetros simples para declarar desde ROCKEY-ARM.

Primero, echemos un vistazo a los tipos de datos utilizados por las interfaces anteriores: dongle_handle, dword, dongle_handle, int y byte.

Echemos un vistazo a los tipos de datos admitidos por FFI-Pina. ref-Pina admite los siguientes tipos:

Los parámetros aquí deben ser del mismo tipo de datos y pueden tener las siguientes coincidencias.

El contenido de la declaración es el siguiente:

Un json, la clave es el nombre de la función exportada por la biblioteca dinámica, como 'Dongle_Open', el valor es una lista, el primer elemento es el valor de retorno, los segundos elementos son parámetros. El parámetro sigue siendo una lista. Hay un tipo adecuado en esta ref-pina. Simplemente escriba el tipo específico, como el valor de retorno DWORD y la longitud entrante int. Aquí uso 'int'. Para otros parámetros, defino además el identificador ryHandle, el puntero del identificador ptrHandle y el puntero de bytes ptrByte. Las definiciones de ryHandle, ptrryHandle y ptrByte son las siguientes:

La esencia de DONGLE_HANDLE es de tipo void*. Al principio, el tipo void * intentó definir una matriz vacía y luego usó una matriz vacía para representar el vacío, y luego descubrió que la afirmación era incorrecta y la matriz no admitía el tipo vacío. Por lo tanto, se utiliza directamente un número sin signo para representar el puntero nulo. El sistema de 64 bits tiene 8 bytes y el sistema de 32 bits tiene 4 bytes. Solo usa el tipo uint. Dongle_handle.

Las funciones de ROCKEY-ARM también tienen muchas interfaces con parámetros, como:

Tome las dos interfaces de funciones anteriores como ejemplos. El primer parámetro en Dongle_Enum es un puntero a la estructura DONGLE_INFO, que devuelve una lista de información del dispositivo después de ejecutarse. Cuando utilice ROCKEY-ARM, debe obtener la lista de información del dispositivo a través de la función de enumeración y luego comparar la ID del producto o la ID del hardware para decidir qué dispositivo abrir.

Para analizar la ID del producto o la ID del hardware a partir de la información del dispositivo devuelta por la función de enumeración, el parámetro DONGLE_INFO* pDongleInfo debe declararse como una matriz de estructuras. La función Dongle_RsaGenPubPriKey () tiene dos parámetros de puntero de estructura, RSA_public_key y RSA_private_keiy, porque los usuarios comunes aquí no necesitan analizar N, D, E y otros componentes en la clave RSA y pueden usarlos directamente como una matriz de bytes, declarada directamente como Tipo ptrByte arriba. Entonces la declaración es la siguiente:

Llame a la función declarada por FFI-Pina, asigne principalmente el valor inicial al tipo de datos que definió y obtenga el valor de retorno del parámetro personalizado. Se explican a continuación.

El int* aquí se refiere a la cantidad de dispositivos devueltos por la función, o la longitud de los datos de entrada pasados ​​o los datos de salida pasados, así que simplemente defina una matriz int con una longitud de 1, de la siguiente manera:

Para asignar un valor a los datos entrantes, solo necesita asignar un valor al elemento con índice 0.

Este parámetro es una lista de información enumerada al dispositivo a través de la función de enumeración. Debido a que se enumeran muchos dispositivos, debe pasar una cantidad suficiente de DONGLE_INFO como se muestra a continuación:

Este parámetro generalmente se usa como un búfer para datos entrantes y salientes, por lo que al crear una matriz, debe crear suficiente El espacio largo es el siguiente:

Durante el proceso de desarrollo, encontramos algunos obstáculos y perdimos mucho tiempo. Aquí hay un resumen.

La estructura de ROCKEY-ARM está alineada en bytes, ref-struct-Pina aún no ha encontrado una manera de establecer la alineación de bytes. La estructura anunciada en ese momento es la siguiente:

Durante las pruebas, encontramos que la alineación de la estructura definida es diferente de la definida por ROCKEY-ARM, por lo que dividimos los miembros m_Birthday y m_HID de ref. type.uint64 en dos uint32 a la izquierda y a la derecha, de modo que la alineación de la estructura pueda ser consistente con la alineación de ROCKEY-ARM. Cuando use m_Birthday y m_HID, debe hablar sobre el empalme de uint32 izquierdo y derecho, lo cual es un poco problemático. Sin embargo, es aceptable garantizar resultados correctos cuando no se encuentra ningún alineador StructType.