npm-package-nodejs-utils-lda
Version:
Este projeto tem como fins de criar e abstrair módulos basicos e utilidades para o node js
343 lines (261 loc) • 9.49 kB
Markdown
# npm-package-nodejs-utils
Este projeto tem como fins de criar e abstrair módulos basicos e utilidades para o node js
requires
.env file
config.json file
data folder
automatic create requires folders and files.
automatic generation of AES + RSA KEYS FOR ENCRYPTION
## Functions
```js
fopen(filePath);
fwrite(filePath, data);
fwriteBin(filePath, data);
stringToBinary(str, binaryLenght);
freadBin(filePath);
binaryToString(binary, binaryLenght);
checkHeaderMiddleware(app);
sendMail(email, subject, text, function(error,data));
fetchGet(url, header, callback);
fetchDownloadStream(url, callback);
fetchPost(url, payload, header, function(error,data));
// only JSON
fetchPostJson(url, payload, header, callback);
httpsSecurityMiddleware(req, res, next);
setCacheHeaders(req, res, next);
getRandomInt(max);
getRandomBin(max);
getRandomHex(max);
generateToken();
validadeApiKey(req,res,key);
forbidden(res);
unauthorized(res);
notfound(res);
discordLogs(title, message)
autoLoader(app);
spaceUsed(space, used);
serverTry(res,callback)
sendFileToDiscord(file, webhookUrl);
log(message, filepath = "logs.txt", maxLength = 100);
```
Este arquivo implementa um canal criptográfico seguro no nível da aplicação, funcionando como um mini-TLS customizado, porém controlado totalmente por código.
Usa padrões modernos e seguros
- RSA-OAEP com SHA-256 (correto)
- AES-256-GCM (estado da arte)
- Proteção contra replay
- Separação clara de responsabilidades
### Casos de uso reais
- APIs seguras entre servidores
- Comunicação cliente ↔ backend sensível
- Sistemas financeiros
- Troca de credenciais
- Licenciamento de software
- Autenticação forte sem TLS customizado
- Comunicação entre containers isolados
# usage
```js
import express from 'express';
import { encryptedPayloadMiddleware } from 'npm-package-nodejs-utils-lda';
const app = express();
app.use(express.json());
app.post('/secure-endpoint', encryptedPayloadMiddleware, (req, res) => {
res.json({ received: req.decryptedBody });
});
app.listen(3000, () => console.log('Servidor rodando na porta 3000'));
```
# client mode
🔑 Crypto Client Implementation (Front-end/Node.js)
Para que o cliente (browser, React, ou outro servidor) possa se comunicar com segurança, ele deve:
Buscar a chave RSA pública do servidor (/public-keys/public_key.pem).
Gerar uma chave AES efêmera.
Criptografar a chave AES com a chave RSA pública (Key Exchange).
Criptografar o payload da mensagem com a chave AES (Data Encryption).
Enviar o pacote completo (AES key, IV, AuthTag, Timestamp, Nonce) ao endpoint seguro.
Exemplo de Código do Lado do Cliente (Browser/Web Crypto API)
```js
// crypto_client.js (Implementação de referência)
// 1. Defina a URL da chave pública (deve ser a rota que você expôs)
const PUBLIC_KEY_URL = '/public-keys/public_key.pem';
const API_URL = '/secure-endpoint';
/**
* Converte um buffer para string Base64 (Web-Safe)
* @param {ArrayBuffer} buffer
* @returns {string} Base64 Web-Safe string.
*/
function arrayBufferToBase64(buffer) {
let binary = '';
const bytes = new Uint8Array(buffer);
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
}
/**
* Busca e importa a chave RSA pública do servidor.
* @returns {Promise<CryptoKey>} Chave RSA importada.
*/
async function getPublicKey() {
const response = await fetch(PUBLIC_KEY_URL);
if (!response.ok) throw new Error('Falha ao buscar chave pública do servidor.');
const pem = await response.text();
// Remove cabeçalho e rodapé PEM e trata Base64
const base64 = pem
.replace('-----BEGIN PUBLIC KEY-----', '')
.replace('-----END PUBLIC KEY-----', '')
.replace(/\s/g, '');
const binaryDer = Uint8Array.from(atob(base64), c => c.charCodeAt(0));
// Importa a chave pública para a Web Crypto API
return crypto.subtle.importKey(
'spki',
binaryDer,
{
name: "RSA-OAEP",
hash: "SHA-256",
},
true,
["wrapKey"]
);
}
/**
* Criptografa o payload para ser enviado ao servidor.
* @param {object} data - O objeto JSON a ser criptografado.
* @returns {Promise<object>} O payload criptografado pronto para envio.
*/
export async function encryptAndSend(data) {
const rsaPublicKey = await getPublicKey();
// 1. Gerar Chave AES-256-GCM (Chave Secreta Efêmera)
const aesKey = await crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt", "wrapKey", "unwrapKey"]
);
// 2. Criptografar (Wrap) a Chave AES com a Chave RSA Pública (RSA-OAEP)
const encryptedKeyBuffer = await crypto.subtle.wrapKey(
"raw",
aesKey,
rsaPublicKey,
{ name: "RSA-OAEP" }
);
// 3. Criptografar o Payload (AES-256-GCM)
const iv = crypto.getRandomValues(new Uint8Array(12)); // Initialization Vector (IV)
const plaintext = JSON.stringify(data);
const encodedData = new TextEncoder().encode(plaintext);
const cipherBuffer = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv: iv },
aesKey,
encodedData
);
// O AES-GCM anexa o AuthTag ao final do ciphertext
const authTagLength = 16; // 16 bytes para GCM
const encryptedDataBuffer = cipherBuffer.slice(0, cipherBuffer.byteLength - authTagLength);
const authTagBuffer = cipherBuffer.slice(cipherBuffer.byteLength - authTagLength);
// Gerar Timestamp e Nonce para Proteção Anti-Replay
const timestamp = Date.now();
const nonce = arrayBufferToBase64(crypto.getRandomValues(new Uint8Array(16)));
// 4. Preparar o Pacote Final
const payload = {
encryptedData: arrayBufferToBase64(encryptedDataBuffer),
encryptedKey: arrayBufferToBase64(encryptedKeyBuffer),
iv: arrayBufferToBase64(iv.buffer),
authTag: arrayBufferToBase64(authTagBuffer),
timestamp: timestamp,
nonce: nonce
};
// 5. Enviar para o Servidor
const response = await fetch(API_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
return response.json();
}
// Exemplo de uso:
/*
encryptAndSend({ nome: "Luis das Artimanhas", valor: 500.00 })
.then(res => console.log("Resposta do Servidor:", res))
.catch(err => console.error("Erro na comunicação segura:", err));
*/
```
***
# user system
```js
insertUser(name,userdata);
return userdata saved
selectUser(ID);
return userdata
usersList();
return users ID,name
deleteUser(ID);
alterUser(ID, name, newUserData);
disableUser(ID);
reactivateUser(ID);
```
# mongo DB
```js
mongoConnect(connectionString)
// SET 'MONGO_CONNECTION_STRING' VARIABLE IN .ENV FILE FOR SECURE AND AUTOMATIC CONNECTION
mongoConnect()
// connection = await mongoConnect(connectionString);
select(connection, database, table)
return all data of selected table
insert(connection, database, table, data)
return mongoClient or connection
```
## Usage
````js
import { fopen, fwrite, generateToken, fetchGet } from "npm-package-nodejs-utils-lda";
const filePath = "database.json"
// Usando as funções
const data = fopen(filePath);
data.push("X");
fwrite(filePath, data);
const token = generateToken();
fetchGet("https://example.com",null, (onError,data)=>{
if(onError){
res.send(error);
}
res.send(data);
});
app.get("/baixar", (req, res) => {
const fileUrl = "https://exemplo.com/arquivo.zip"; // URL do arquivo
fetchDownloadStream(fileUrl, (err, fileStream) => {
if (err) {
return res.status(500).send("Erro ao baixar o arquivo.");
}
// Define o cabeçalho para download
res.setHeader("Content-Disposition", 'attachment; filename="arquivo.zip"');
res.setHeader("Content-Type", "application/octet-stream");
// Envia o stream do arquivo para o cliente
fileStream.pipe(res);
});
});
# WSChat
## With Express (recommended)
If you already have an Express server, just pass the app instance to WSChat:
````js
import express from "express";
import WSChat from "./WSchat.lib.mjs"; // or require() for CommonJS
const app = express();
const server = WSChat(app, {
welcomeMessage: "Hello! Welcome to the chat."
});
server.listen(3000, () => {
console.log("Server running on port 3000");
});
````
This creates the HTTP + WebSocket server using the same Express server.
## Without Express (standalone WebSocket server)
If you want to run WSChat alone, without Express:
````js
import WSChat from "./WSchat.lib.mjs";
WSChat(null, { port: 8080 }); // starts HTTP + WS server on port 8080
````
---
## Options
The second argument is an optional object with the following properties:
````js
{
port: 8080, // Number - Port to listen on if WSChat creates its own HTTP server (default 8080)
welcomeMessage: "Welcome to WSChat!" // String - Message sent to clients immediately after connection
}
````