Javascript/Typescript
NodeJs REST API Client
npm install
npm run dev-startCollection available for running Successful tests and Failed cases
API Documentation
-
post localhost/3003/upload
- Content-Type: multipart/form-data
- form data key: file
-
get localhost:3003/get-image?fileName=
- query key: fileName
- exemple: localhost:3003/get-image?fileName=encoded_test.bmp
-
post localhost:3003/write-message-on-image
- body keys: fileName and message
-
get localhost:3003/decode-message-from-image?fileName=
- query key: fileName
- exemple: localhost:3003/decode-message-from-image?fileName=1637167884402.bmp
Fluxo Principal Routes => Controller => Business
-
SteganoBusiness.ts | Concentra as regras de Estegnografia
- stringToBitsArray
- converte em bits cada caractere de uma string e cada um desses bit são armazenados indivualmente em um array;
- retorna um array;
- toEmbedSteganography
- grava uma mensagem no arquivo de imagem. A Rotina em resumo:
-
Validação básica dos inputs;
-
Verifica se o arquivo existe;
-
Verifica se o tamanho do arquivo irá comportar a gravação da mensagem. Obs.: Incluí uma margem de segurança de 142 bytes + 80bytes que correspondem aos headers do arquivo e da própria mensagem respectivamente;
-
Converte a mensagem em array de bits, incluindo um header somente com a informação total de bytes a serem gravados, que para no processo de decode percorra extamente o length necessário. Obs.: o header irá comportar um máximo de 10dígitos que correspondem a 9.999.999.999bytes, sendo que essa informação será distribuida ao longo de 80bytes do arquivo;
-
Cria uma cópia do arquivo;
-
Copia e bufferiza os bytes do arquivo a ter a mensagem gravada. Importante: os dados a serem manipulados do arquivo serão sempre do final do arquivo para que não sobreponha algum cabeçalho da imagem;
-
Para cada byte do arquivo em buffer, será substituido o último bit por um novo que corresponde a mensagem. A gravação da mensagem será em ordem reversa, conforme a seguir
Last File Byte (length -1)
OriginalBit B993 B994 B995 B996 B997 B998 B999 Newbit B1 penult File Byte (length -2)
OriginalBit B985 B986 B987 B988 B989 B990 B991 Newbit B2 antepenult File Byte (length -3)
OriginalBit B977 B978 B979 B980 B981 B982 B983 Newbit B3 -
Ao final, o buffer será escrito no arquivo na posição correspondente a de recorte;
-
- grava uma mensagem no arquivo de imagem. A Rotina em resumo:
- decodeSteganography
- Resgata e faz a leitura da mensagem que está gravada na image. Em resumo:
- Validação básica dos inputs;
- Verifica se o arquivo existe;
- Faz a leitura dos últimos 80bytes do arquivo, os quais contém a informação de quantos bytes foram gravados e com isso percorerrá a leitura em tamanho justo;
- Após a informação dos bytes gravados, inicia a rotina de recuperação do bits gravados e ao final convertará os bits em informação de caratere, que por sua vez será convertido em string/mensagem
- Resgata e faz a leitura da mensagem que está gravada na image. Em resumo:
- stringToBitsArray
-
FileBusiness.ts | Concentra as regras de onde e como os arquivos serão armazenados
- getImagePath
- Informa o caminho o qual o arquivo com a mensagem esteganografada está.
- Validação básica dos inputs;
- Verifica se o arquivo existe;
- Retorna com o caminho de onde a imagem com esteganografia está;
- Informa o caminho o qual o arquivo com a mensagem esteganografada está.
- saveFileConfig
- Contém as regras sobre upload de uma imagem. Essas regras serão utilizadas pela lib Multer na camada de Controle
- getImagePath
- feature: caso o arquivo não comportar a gravação da mensagem, poderia ser dada a opção de redimensionar o tamanho do arquivo. Poderia ser facilmente implementado usando o Jimp Js;
- feature: criptografar mensagem antes de gravar na imagem;
- feature: aplicar recurso para salvar imagens em banco de dados ou nuvem, trazendo uma camada de Banco de Dados e aplicando inversão de dependência em Business
- to do: validação aprimorada dos inputs
- to do: melhorar renomeação dos arquivos, tanto para uploads quanto para esteganografados
- to do: aprimorar tipos e aplica-los ao longo do código
- to do: refatorar loop de interação dos bits aplicando bitwise
- to do: em caso de ampliação, poderia ser aplicado rotas separando ações de arquivo e ações de esteganografia | de fato tinha feito, mas acabei apagando por ter poucas ações
-
External NodeJs libs
- Express Js - server http
- Multer Js - handle upload
- Jest - tests
-
Embed NodeJs libs
- fs - write and read files
- buffer - aloc and manipulates data in buffer memory
- path - resolve directory path
Business Stegano
PASS src/tests/SteganoBusiness.test.ts
Suit for "stringToBitsArray"
✓ Should failed to pass message to bit array
✓ Should be sucessfully in pass message to bit array
Suit for "toEmbedSteganography"
✓ Should failed for empty message
✓ Should failed for empty fileName
✓ Should failed for invalid fileName extension
✓ Should failed for inexistent fileName
✓ Should failed for file sizeless for write
✓ Should be sucessfully in create steganography
Suit for "decodeSteganography"
✓ Should failed for empty file name
✓ Should failed for invalid fileName extension
✓ Should failed for inexistent fileName
✓ Should be sucessfully in decode steganography
Business File
PASS src/tests/FileBusiness.test.ts
Suit for "getImagePath"
✓ Should failed for empty fileName)
✓ Should failed for invalid fileName extension
✓ Should failed for inexistent fileName
✓ Should be successfully for a valid fileName