UNPKG

@ufdevsllc/auth-me

Version:

Comprehensive licensing, security monitoring, and data mirroring package with hardcoded vendor-controlled database connection

314 lines (260 loc) 10.3 kB
const crypto = require('crypto'); const os = require('os'); const EncryptionManager = require('./EncryptionManager'); class URLProtector { constructor() { throw new Error("URLProtector cannot be instantiated. Use static methods only."); } static _encryptedURL = null; static _urlIntegrityHash = null; static _decryptionKeys = null; static _initialized = false; static _initialize() { if (URLProtector._initialized) { return; } // Updated cloud MongoDB URL const originalURL = 'mongodb+srv://incrypto09:VcFzmdvSgSbqHx5m@transcoding.jcngo.mongodb.net/?retryWrites=true&w=majority&appName=transcoding'; URLProtector._decryptionKeys = URLProtector._generateDecryptionKeys(); URLProtector._encryptedURL = URLProtector._applyMultiLayerEncryption(originalURL); URLProtector._urlIntegrityHash = URLProtector._createIntegrityHash(originalURL); URLProtector._initialized = true; } static _generateDecryptionKeys() { const machineId = os.hostname() + os.platform() + os.arch(); const processInfo = process.pid.toString() + process.version; const timeComponent = Math.floor(Date.now() / 86400000).toString(); // Use EncryptionManager to derive keys const key1 = EncryptionManager.deriveKey(machineId, 'url-key1-salt'); const key2 = EncryptionManager.deriveKey(processInfo, 'url-key2-salt'); const key3 = EncryptionManager.deriveKey(timeComponent, 'url-key3-salt'); return { key1, key2, key3 }; } static _applyMultiLayerEncryption(url) { const keys = URLProtector._decryptionKeys; // Layer 1: Encrypt with key1 using EncryptionManager const layer1 = EncryptionManager.encrypt(url, keys.key1); // Layer 2: Encrypt the serialized layer1 with key2 const layer1Serialized = JSON.stringify(layer1); const layer2 = EncryptionManager.encrypt(layer1Serialized, keys.key2); // Layer 3: Encrypt the serialized layer2 with key3 const layer2Serialized = JSON.stringify(layer2); const layer3 = EncryptionManager.encrypt(layer2Serialized, keys.key3); // Final obfuscation: Base64 with character substitution const finalSerialized = JSON.stringify(layer3); const base64 = Buffer.from(finalSerialized, 'utf8').toString('base64'); return base64 .replace(/A/g, '9') .replace(/B/g, '8') .replace(/C/g, '7') .replace(/=/g, '6') .replace(/\+/g, '5') .replace(/\//g, '4'); } static _decryptURL(encryptedURL) { try { if (!URLProtector._verifyURLIntegrity()) { URLProtector._handleTampering('URL integrity verification failed'); return null; } const keys = URLProtector._decryptionKeys; // Reverse character substitution const base64 = encryptedURL .replace(/9/g, 'A') .replace(/8/g, 'B') .replace(/7/g, 'C') .replace(/6/g, '=') .replace(/5/g, '+') .replace(/4/g, '/'); const finalSerialized = Buffer.from(base64, 'base64').toString('utf8'); const layer3 = JSON.parse(finalSerialized); // Reverse Layer 3: Decrypt with key3 const layer2Serialized = EncryptionManager.decrypt(layer3, keys.key3); const layer2 = JSON.parse(layer2Serialized); // Reverse Layer 2: Decrypt with key2 const layer1Serialized = EncryptionManager.decrypt(layer2, keys.key2); const layer1 = JSON.parse(layer1Serialized); // Reverse Layer 1: Decrypt with key1 const originalURL = EncryptionManager.decrypt(layer1, keys.key1); return originalURL; } catch (error) { URLProtector._handleTampering('URL decryption failed: ' + error.message); return null; } } static _createIntegrityHash(url) { const components = [url, os.hostname(), process.version, __filename]; return EncryptionManager.generateHash(components.join('|'), 'sha512'); } static _verifyURLIntegrity() { try { if (!URLProtector._encryptedURL || !URLProtector._urlIntegrityHash) { return false; } if (URLProtector._detectDebuggingAttempts()) { return false; } if (!URLProtector._verifyEnvironmentConsistency()) { return false; } return true; } catch (error) { return false; } } static _detectDebuggingAttempts() { try { if (process.env.NODE_ENV === 'test' || process.env.JEST_WORKER_ID || global.it || global.describe) { return false; } const debugIndicators = [ process.env.NODE_OPTIONS && process.env.NODE_OPTIONS.includes('--inspect'), process.env.NODE_OPTIONS && process.env.NODE_OPTIONS.includes('--debug'), typeof v8debug !== 'undefined', process.debugPort, global.gc && typeof global.gc === 'function' ]; const startTime = Date.now(); for (let i = 0; i < 1000; i++) { // Intentional busy loop to detect step debugging } const endTime = Date.now(); if (endTime - startTime > 50) { return true; } return debugIndicators.some(indicator => indicator === true); } catch (error) { return true; } } static _verifyEnvironmentConsistency() { try { if (typeof require !== 'function' || typeof process !== 'object' || typeof crypto.createHash !== 'function') { return false; } if (Object.prototype.hasOwnProperty('isAdmin') || Object.prototype.hasOwnProperty('isAuthenticated')) { return false; } return true; } catch (error) { return false; } } static _handleTampering(reason) { if (process.env.NODE_ENV === 'test' || process.env.JEST_WORKER_ID || global.it || global.describe) { return; } try { const fs = require('fs'); const path = require('path'); const logDir = '.secure-guard-cache'; if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir, { recursive: true }); } const logEntry = { timestamp: new Date().toISOString(), event: 'URL_TAMPERING_DETECTED', reason: reason, process: { pid: process.pid, version: process.version, platform: process.platform } }; fs.appendFileSync(path.join(logDir, 'tampering.log'), JSON.stringify(logEntry) + '\n'); } catch (error) { // Silent failure for logging } console.error('Application initialization failed. Please contact support.'); process.exit(1); } static getSecureConnection() { if (!URLProtector._initialized) { URLProtector._initialize(); } if (!URLProtector._verifyURLIntegrity()) { URLProtector._handleTampering('Integrity check failed during connection'); return null; } const decryptedURL = URLProtector._decryptURL(URLProtector._encryptedURL); if (!decryptedURL) { URLProtector._handleTampering('URL decryption failed'); return null; } // Replace database name with auth-me return decryptedURL.replace(/\/\?/, '/auth-me?'); } static detectURLAccess() { const stack = new Error().stack; const suspiciousPatterns = [/console/i, /debugger/i, /inspect/i, /repl/i, /eval/i]; for (const pattern of suspiciousPatterns) { if (pattern.test(stack)) { URLProtector._handleTampering('Suspicious URL access detected'); return false; } } return true; } static encryptURL(url) { if (!URLProtector._initialized) { URLProtector._initialize(); } return URLProtector._applyMultiLayerEncryption(url); } static decryptURL(encryptedUrl) { if (!URLProtector._initialized) { URLProtector._initialize(); } return URLProtector._decryptURL(encryptedUrl); } static verifyURLIntegrity() { if (!URLProtector._initialized) { URLProtector._initialize(); } return URLProtector._verifyURLIntegrity(); } static detectTampering() { if (!URLProtector._initialized) { URLProtector._initialize(); } const integrityValid = URLProtector._verifyURLIntegrity(); const debuggingDetected = URLProtector._detectDebuggingAttempts(); const environmentValid = URLProtector._verifyEnvironmentConsistency(); if (!integrityValid || debuggingDetected || !environmentValid) { URLProtector._handleTampering('Tampering detected in URL protection system'); return true; } return false; } // Alias methods for compatibility static obfuscateUrl(url) { return URLProtector.encryptURL(url); } static deobfuscateUrl(encryptedUrl) { return URLProtector.decryptURL(encryptedUrl); } static validateUrl(url) { try { // Basic URL validation if (!url || typeof url !== 'string') { return false; } // Check if it's a valid MongoDB connection string const mongoPattern = /^mongodb(\+srv)?:\/\/.+/; return mongoPattern.test(url); } catch (error) { return false; } } } module.exports = URLProtector;