npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

quantum_ark

v0.2.0

Published

Librería avanzada para hashing cuántico y cifrado post-cuántico en WebAssembly

Readme

Quantum Ark 🔐

License: GPL-3.0 npm version Weekly Downloads Package Integrity

Quantum Ark es una librería WebAssembly de alto rendimiento para hashing criptográfico de nivel empresarial, diseñada con algoritmos post-cuánticos avanzados. Protege aplicaciones críticas contra ataques clásicos y cuánticos mediante técnicas inspiradas en estándares NIST PQC.


🛡️ Características de Seguridad

Seguridad Post-Cuántica

  • Resistencia Cuántica: Implementa primitivas basadas en lattice-based cryptography resistentes a algoritmos cuánticos
  • Sistema de Difusión Avanzado: Arquitectura no-lineal que previene análisis diferencial
  • PBKDF2 Extendido: 80,000-150,000 iteraciones con SHA3-512
  • Protección Timing-Attack: Comparaciones de tiempo constante para prevenir side-channel attacks

Arquitectura Segura

  • Zero-Knowledge: El algoritmo no expone información sobre las contraseñas procesadas
  • Determinismo Criptográfico: Mismo input → mismo hash, garantizando reproducibilidad
  • Formato Versionado: Sistema de prefijos versionados para compatibilidad futura
  • Retrocompatibilidad: Soporte automático para hashes legacy

📦 Instalación

npm install quantum_ark

🚀 Uso Básico

JavaScript/TypeScript (Vite, Webpack 5+)

import init, { 
  quantum_ark_hash,
  quantum_ark_hash_with_hmac,
  quantum_ark_verify 
} from 'quantum_ark';

// IMPORTANTE: Si usas Vite, añade esta línea
import wasmUrl from "quantum_ark/quantum_ark_bg.wasm?url";

async function setupQuantumArk() {
  // Inicializar WebAssembly
  // En Vite: await init(wasmUrl);
  // En otros: await init();
  await init();
  
  const password = "mi_password_seguro_2025";
  const appKey = "mi_clave_aplicacion_secreta_unica";
  
  // Método 1: Hash estándar (uso general)
  const hash = quantum_ark_hash(password, appKey);
  console.log('Hash:', hash);
  // Output: v2$<salt_64_hex><hash_128_hex>
  
  // Método 2: Hash con HMAC (máxima seguridad)
  const hashHMAC = quantum_ark_hash_with_hmac(password, appKey);
  console.log('Hash HMAC:', hashHMAC);
  // Output: v2h$<salt_64_hex><hash_128_hex><hmac_64_hex>
  
  // Verificación
  const isValid = quantum_ark_verify(password, appKey, hash);
  console.log('Válido:', isValid); // true
}

setupQuantumArk();

React + Vite (Configuración Completa)

import { useEffect, useState } from 'react';
import init, { 
  quantum_ark_hash_with_hmac, 
  quantum_ark_verify 
} from 'quantum_ark';
import wasmUrl from "quantum_ark/quantum_ark_bg.wasm?url";

function AuthComponent() {
  const [initialized, setInitialized] = useState(false);
  const APP_KEY = import.meta.env.VITE_QUANTUM_KEY; // desde .env

  useEffect(() => {
    // Inicializar con la URL del WASM en Vite
    init(wasmUrl).then(() => {
      console.log('✅ Quantum Ark inicializado');
      setInitialized(true);
    }).catch(err => {
      console.error('❌ Error al inicializar:', err);
    });
  }, []);

  const handleRegister = async (password) => {
    if (!initialized) {
      console.warn('⚠️ Esperando inicialización...');
      return;
    }
    
    try {
      const hash = quantum_ark_hash_with_hmac(password, APP_KEY);
      
      // Guardar en backend
      const response = await fetch('/api/register', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ 
          username: '[email protected]',
          passwordHash: hash 
        })
      });
      
      if (response.ok) {
        console.log('✅ Usuario registrado');
      }
    } catch (error) {
      console.error('❌ Error en registro:', error);
    }
  };

  const handleLogin = async (password, storedHash) => {
    if (!initialized) return false;
    
    try {
      const isValid = quantum_ark_verify(password, APP_KEY, storedHash);
      return isValid;
    } catch (error) {
      console.error('❌ Error en verificación:', error);
      return false;
    }
  };

  return (
    <div>
      {initialized ? (
        <LoginForm 
          onRegister={handleRegister}
          onLogin={handleLogin} 
        />
      ) : (
        <p>Cargando sistema de seguridad...</p>
      )}
    </div>
  );
}

export default AuthComponent;

Next.js (App Router)

'use client';

import { useEffect, useState } from 'react';
import init, { quantum_ark_hash_with_hmac } from 'quantum_ark';

export default function AuthPage() {
  const [ready, setReady] = useState(false);

  useEffect(() => {
    // En Next.js no necesitas wasmUrl
    init().then(() => setReady(true));
  }, []);

  const handleHash = async (password) => {
    if (!ready) return;
    
    const hash = quantum_ark_hash_with_hmac(
      password, 
      process.env.NEXT_PUBLIC_QUANTUM_KEY
    );
    
    // Enviar a API Route
    await fetch('/api/auth/register', {
      method: 'POST',
      body: JSON.stringify({ hash })
    });
  };

  return ready ? <Form onSubmit={handleHash} /> : <Loading />;
}

HTML Vanilla

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Quantum Ark - Sistema Seguro</title>
</head>
<body>
  <h1>Sistema de Autenticación Post-Cuántico</h1>
  
  <div>
    <input type="password" id="password" placeholder="Contraseña">
    <input type="text" id="key" placeholder="Clave de Aplicación" 
           value="mi_clave_secreta_app">
    <button id="hashBtn">Generar Hash</button>
    <button id="verifyBtn">Verificar</button>
  </div>
  
  <pre id="output"></pre>

  <script type="module">
    import init, { 
      quantum_ark_hash_with_hmac,
      quantum_ark_verify 
    } from './node_modules/quantum_ark/quantum_ark.js';

    let storedHash = '';

    async function run() {
      // Inicializar WebAssembly
      await init();
      console.log('✅ Quantum Ark listo');
      
      document.getElementById('hashBtn').addEventListener('click', () => {
        const password = document.getElementById('password').value;
        const key = document.getElementById('key').value;
        
        if (!password || !key) {
          alert('⚠️ Completa todos los campos');
          return;
        }
        
        try {
          storedHash = quantum_ark_hash_with_hmac(password, key);
          document.getElementById('output').textContent = 
            `✅ Hash generado (${storedHash.length} caracteres):\n\n${storedHash}\n\n` +
            `Guarda este hash en tu base de datos.`;
        } catch (error) {
          document.getElementById('output').textContent = 
            `❌ Error: ${error.message}`;
        }
      });

      document.getElementById('verifyBtn').addEventListener('click', () => {
        const password = document.getElementById('password').value;
        const key = document.getElementById('key').value;
        
        if (!storedHash) {
          alert('⚠️ Primero genera un hash');
          return;
        }
        
        try {
          const isValid = quantum_ark_verify(password, key, storedHash);
          document.getElementById('output').textContent = 
            isValid ? '✅ Contraseña CORRECTA' : '❌ Contraseña INCORRECTA';
        } catch (error) {
          document.getElementById('output').textContent = 
            `❌ Error: ${error.message}`;
        }
      });
    }
    
    run();
  </script>
</body>
</html>

🔧 API Reference

quantum_ark_hash(password: string, key: string): string

Genera un hash criptográfico seguro.

Parámetros:

  • password (string): Contraseña del usuario
  • key (string): Clave secreta única de tu aplicación (mínimo 16 caracteres recomendado)

Retorna: String formato v2$<salt><hash> (192 caracteres)

Ejemplo:

const hash = quantum_ark_hash("miPassword2025", "mi_app_secret_key");
// v2$a1b2c3...

Uso recomendado: Aplicaciones de uso general con alta demanda de rendimiento.


quantum_ark_hash_with_hmac(password: string, key: string): string

Genera hash con capa adicional HMAC para máxima integridad.

Parámetros:

  • password (string): Contraseña del usuario
  • key (string): Clave secreta de la aplicación

Retorna: String formato v2h$<salt><hash><hmac> (256 caracteres)

Ejemplo:

const hash = quantum_ark_hash_with_hmac("password123", "secure_key");
// v2h$f4e3d2...

Uso recomendado: Aplicaciones críticas (fintech, healthcare, government, e-commerce).


quantum_ark_verify(password: string, key: string, storedHash: string): boolean

Verifica una contraseña contra un hash almacenado.

Parámetros:

  • password (string): Contraseña a verificar
  • key (string): Clave secreta (la misma usada al generar el hash)
  • storedHash (string): Hash almacenado en base de datos

Retorna: true si válido, false si inválido

Ejemplo:

const isValid = quantum_ark_verify(
  "password123", 
  "secure_key", 
  storedHashFromDB
);

if (isValid) {
  console.log('✅ Autenticación exitosa');
} else {
  console.log('❌ Credenciales inválidas');
}

Seguridad: Usa comparación de tiempo constante (constant-time) para prevenir timing attacks.


quantum_ark_hash_extreme(password: string, key: string): string

Hash con triple capa de seguridad para aplicaciones de máxima criticidad.

Parámetros:

  • password (string): Contraseña del usuario
  • key (string): Clave secreta de la aplicación

Retorna: String formato v2x$<hash> (132 caracteres)

Ejemplo:

const extremeHash = quantum_ark_hash_extreme("topSecret", "ultra_key");
// v2x$9f8e7d...

Uso recomendado: Solo para datos de máxima seguridad donde el rendimiento no es crítico (claves maestras, backups criptográficos).


quantum_ark_generate_salt(): string

Genera un salt aleatorio criptográficamente seguro.

Retorna: String hexadecimal de 64 caracteres

Ejemplo:

const salt = quantum_ark_generate_salt();
// a1b2c3d4e5f6...

Nota: El sistema ya genera salts automáticamente. Esta función es opcional para casos avanzados.


📊 Comparación de Métodos

| Método | Formato | Longitud | Seguridad | Velocidad | Uso Recomendado | |--------|---------|----------|-----------|-----------|-----------------| | quantum_ark_hash | v2$ | 192 chars | ★★★★☆ | Rápida (50-100ms) | Producción general | | quantum_ark_hash_with_hmac | v2h$ | 256 chars | ★★★★★ | Media (80-150ms) | Aplicaciones críticas | | quantum_ark_hash_extreme | v2x$ | 132 chars | ★★★★★★ | Lenta (150-300ms) | Máxima seguridad |


🔒 Principios de Seguridad

Zero-Knowledge Architecture

Quantum Ark NO expone información sobre las contraseñas procesadas:

  • Determinista: Mismo input → mismo output (verificable y reproducible)
  • No reversible: Imposible obtener la contraseña desde el hash
  • Resistente a colisiones: Espacio de salida de 2^512 bits
  • Salt único: Cada hash tiene su propio salt aleatorio

Protección Multi-Capa

  1. PBKDF2: 80,000-150,000 iteraciones con SHA3-512
  2. Lattice-Based Mixing: Resistencia contra algoritmos cuánticos (Shor, Grover)
  3. Sistema de Difusión: Transformaciones no-lineales avanzadas
  4. Transformaciones Algebraicas: Inspirado en algoritmos NIST PQC
  5. HMAC-SHA3: Verificación de integridad en modo v2h$

Resistencia a Ataques

| Tipo de Ataque | Protección Implementada | |----------------|-------------------------| | Fuerza Bruta | PBKDF2 (80k+ iteraciones) + complejidad algorítmica | | Rainbow Tables | Salt único criptográfico de 256 bits | | Timing Attacks | Comparación constant-time en verify() | | Ataques de Preimagen | SHA3-512 + transformaciones no-lineales | | Colisiones | Espacio de salida masivo (2^512) | | Ataques Cuánticos | Primitivas basadas en lattice cryptography | | Side-Channel | Operaciones de tiempo constante |


⚙️ Configuración Avanzada

Variables de Entorno (Recomendadas)

Vite (.env)

VITE_QUANTUM_KEY=tu_clave_secreta_unica_de_64_caracteres_minimo_recomendado
const APP_KEY = import.meta.env.VITE_QUANTUM_KEY;

Next.js (.env.local)

NEXT_PUBLIC_QUANTUM_KEY=tu_clave_secreta_aqui
const APP_KEY = process.env.NEXT_PUBLIC_QUANTUM_KEY;

Node.js / Express (.env)

QUANTUM_ARK_APP_KEY=tu_clave_secreta_aqui
require('dotenv').config();
const APP_KEY = process.env.QUANTUM_ARK_APP_KEY;

Best Practices

HACER:

  • Usa quantum_ark_hash_with_hmac() para aplicaciones críticas (fintech, healthcare)
  • Mantén la key secreta, única por aplicación y de mínimo 32 caracteres
  • Almacena hashes en columnas VARCHAR(256) o TEXT
  • Usa HTTPS para transmitir contraseñas
  • Implementa rate limiting en endpoints de autenticación (ej: 5 intentos/minuto)
  • Usa await init() antes de llamar cualquier función
  • En Vite, importa el WASM: import wasmUrl from "quantum_ark/quantum_ark_bg.wasm?url"

NO HACER:

  • No reutilices key entre diferentes aplicaciones
  • No uses keys predecibles (ej: "ARK", "password", "123", "secret")
  • No almacenes contraseñas en texto plano
  • No intentes modificar el archivo .wasm compilado
  • No omitas la verificación de integridad (ver sección SHA-256)
  • No uses localStorage para guardar la key (usa variables de entorno)

🧪 Testing

Ejemplo con Jest

import init, { quantum_ark_hash, quantum_ark_verify } from 'quantum_ark';

describe('Quantum Ark Security Tests', () => {
  beforeAll(async () => {
    await init();
  });

  test('Hash debe ser determinista', () => {
    const password = "test_password_123";
    const key = "test_key_456";
    
    const hash1 = quantum_ark_hash(password, key);
    const hash2 = quantum_ark_hash(password, key);
    
    expect(hash1).toBe(hash2);
    expect(hash1.length).toBe(192);
  });

  test('Verificación debe funcionar correctamente', () => {
    const password = "mySecurePass2025";
    const key = "myAppSecretKey";
    const hash = quantum_ark_hash(password, key);
    
    expect(quantum_ark_verify(password, key, hash)).toBe(true);
    expect(quantum_ark_verify("wrongPassword", key, hash)).toBe(false);
    expect(quantum_ark_verify(password, "wrongKey", hash)).toBe(false);
  });

  test('Formato de hash debe ser válido', () => {
    const hash = quantum_ark_hash("test", "key");
    
    expect(hash).toMatch(/^v2\$/);
    expect(hash.length).toBe(192);
  });

  test('Diferentes passwords deben generar hashes diferentes', () => {
    const key = "same_key";
    const hash1 = quantum_ark_hash("password1", key);
    const hash2 = quantum_ark_hash("password2", key);
    
    expect(hash1).not.toBe(hash2);
  });

  test('HMAC debe agregar verificación adicional', () => {
    const password = "test";
    const key = "key";
    const hashHMAC = quantum_ark_hash_with_hmac(password, key);
    
    expect(hashHMAC).toMatch(/^v2h\$/);
    expect(hashHMAC.length).toBe(256);
    expect(quantum_ark_verify(password, key, hashHMAC)).toBe(true);
  });
});

Ejemplo con Vitest (Vite)

import { describe, it, expect, beforeAll } from 'vitest';
import init, { quantum_ark_hash_with_hmac } from 'quantum_ark';
import wasmUrl from "quantum_ark/quantum_ark_bg.wasm?url";

describe('Quantum Ark - Vite Integration', () => {
  beforeAll(async () => {
    await init(wasmUrl);
  });

  it('debe generar hash con HMAC', () => {
    const hash = quantum_ark_hash_with_hmac('password', 'key');
    expect(hash).toMatch(/^v2h\$/);
  });
});

🌐 Compatibilidad

Navegadores Soportados

| Navegador | Versión Mínima | WebAssembly | |-----------|----------------|-------------| | Chrome | 57+ | ✅ Soportado | | Firefox | 52+ | ✅ Soportado | | Safari | 11+ | ✅ Soportado | | Edge | 16+ | ✅ Soportado | | Opera | 44+ | ✅ Soportado |

Entornos Node.js

  • Node.js: 16+ (LTS recomendado: 18, 20, 22)
  • Deno: 1.0+ (requiere flags de compatibilidad Node)
  • Bun: 1.0+ (experimental)

Frameworks Soportados

  • ✅ React (CRA, Vite, Next.js)
  • ✅ Vue (Vite, Nuxt)
  • ✅ Angular 14+
  • ✅ Svelte / SvelteKit
  • ✅ Vanilla JS / TypeScript

📈 Rendimiento

Benchmarks en hardware moderno (Intel i7-12700 / Apple M2):

| Método | Tiempo Promedio | Hashes/segundo | |--------|-----------------|----------------| | quantum_ark_hash | 50-100ms | ~15 ops/seg | | quantum_ark_hash_with_hmac | 80-150ms | ~8 ops/seg | | quantum_ark_verify | 50-100ms | ~15 ops/seg | | quantum_ark_hash_extreme | 150-300ms | ~4 ops/seg |

Nota importante: El overhead computacional es intencional para dificultar ataques de fuerza bruta. Para alta concurrencia, considera implementar:

  • Cola de procesamiento (Bull, BullMQ)
  • Worker threads en Node.js
  • Rate limiting estricto
  • Caché de verificaciones recientes

🐛 Troubleshooting

❌ Error: "WebAssembly module not initialized"

Causa: No se llamó await init() antes de usar las funciones.

Solución:

import init from 'quantum_ark';

async function setup() {
  await init(); // ← IMPORTANTE
  // Ahora puedes usar las funciones
}

❌ Error: "Failed to fetch WebAssembly module" (Vite)

Causa: Vite necesita la URL explícita del archivo WASM.

Solución:

import init from 'quantum_ark';
import wasmUrl from "quantum_ark/quantum_ark_bg.wasm?url"; // ← Añadir esto

await init(wasmUrl); // ← Pasar la URL

❌ Error: "Hash format invalid" al verificar

Causa: El hash almacenado está corrupto, truncado o modificado.

Solución:

  • Verifica que la columna de base de datos sea VARCHAR(256) o mayor
  • No truncar el hash al almacenarlo
  • Verifica que no haya espacios en blanco adicionales
// Correcto
const hash = quantum_ark_hash(password, key);
db.save({ hash }); // Guardar completo

// Incorrecto
const hash = quantum_ark_hash(password, key).substring(0, 100); // ❌

⚠️ Rendimiento lento en producción

Optimizaciones recomendadas:

// 1. Worker Threads (Node.js)
const { Worker } = require('worker_threads');

function hashInWorker(password, key) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./hash-worker.js');
    worker.postMessage({ password, key });
    worker.on('message', resolve);
    worker.on('error', reject);
  });
}

// 2. Rate Limiting (Express)
const rateLimit = require('express-rate-limit');

const loginLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 5, // 5 intentos
  message: 'Demasiados intentos, intenta más tarde'
});

app.post('/api/login', loginLimiter, async (req, res) => {
  // Tu lógica de login
});

// 3. Caché de verificaciones recientes (Redis)
const redis = require('redis');
const client = redis.createClient();

async function verifyWithCache(password, storedHash, key) {
  const cacheKey = `verify:${storedHash}:${password}`;
  const cached = await client.get(cacheKey);
  
  if (cached !== null) return cached === 'true';
  
  const isValid = quantum_ark_verify(password, key, storedHash);
  await client.setEx(cacheKey, 300, isValid.toString()); // Cache 5min
  
  return isValid;
}

🔧 Configuración TypeScript

Si usas TypeScript y ves errores de tipos, crea un archivo de declaración:

quantum_ark.d.ts:

declare module 'quantum_ark' {
  export function quantum_ark_hash(password: string, key: string): string;
  export function quantum_ark_hash_with_hmac(password: string, key: string): string;
  export function quantum_ark_verify(password: string, key: string, storedHash: string): boolean;
  export function quantum_ark_hash_extreme(password: string, key: string): string;
  export function quantum_ark_generate_salt(): string;
  export default function init(url?: string): Promise<void>;
}

🔍 Verificación de Integridad (SHA-256)

Para garantizar que el paquete descargado no ha sido modificado, puedes verificar manualmente el hash SHA-256 del archivo WebAssembly.

📄 Archivo a verificar

node_modules/quantum_ark/quantum_ark_bg.wasm

🔑 Hash oficial SHA-256

548CAF657EB7499A366ACB51E42CA53970DC22C8A4CAD66B080B0A0886B6498F

🧩 Cómo verificarlo

Windows (PowerShell)

Get-FileHash .\node_modules\quantum_ark\quantum_ark_bg.wasm -Algorithm SHA256

Windows (CMD)

certutil -hashfile node_modules\quantum_ark\quantum_ark_bg.wasm SHA256

macOS / Linux

shasum -a 256 node_modules/quantum_ark/quantum_ark_bg.wasm

✅ Resultado esperado

El valor generado debe coincidir exactamente con:

548CAF657EB7499A366ACB51E42CA53970DC22C8A4CAD66B080B0A0886B6498F

⚠️ Si el hash NO coincide:

  1. NO uses el paquete
  2. Reporta el incidente inmediatamente
  3. Reinstala desde npm: npm install quantum_ark --force
  4. Verifica nuevamente

🔐 Auditoría y Transparencia

Reporte de Vulnerabilidades

Si descubres una vulnerabilidad de seguridad, NO la publiques públicamente.

Contacta directamente:

📧 Email: [email protected]
🔒 PGP Key Fingerprint: 7FEA B5FE 7E86 EC6B 56BE E0A0 3D26 BED8 64C4 28D8


💾 Ejemplo de Integración Backend

Node.js + Express

const express = require('express');
const init = require('quantum_ark').default;
const { 
  quantum_ark_hash_with_hmac, 
  quantum_ark_verify 
} = require('quantum_ark');

const app = express();
app.use(express.json());

let quantumReady = false;

// Inicializar al arrancar el servidor
init().then(() => {
  quantumReady = true;
  console.log('✅ Quantum Ark inicializado');
}).catch(err => {
  console.error('❌ Error al inicializar Quantum Ark:', err);
  process.exit(1);
});

const APP_KEY = process.env.QUANTUM_ARK_KEY;

// Middleware para verificar inicialización
const ensureQuantumReady = (req, res, next) => {
  if (!quantumReady) {
    return res.status(503).json({ 
      error: 'Sistema de seguridad no disponible' 
    });
  }
  next();
};

// Registro de usuario
app.post('/api/register', ensureQuantumReady, async (req, res) => {
  try {
    const { username, password } = req.body;
    
    if (!password || password.length < 8) {
      return res.status(400).json({ 
        error: 'Password debe tener mínimo 8 caracteres' 
      });
    }
    
    // Generar hash seguro
    const passwordHash = quantum_ark_hash_with_hmac(password, APP_KEY);
    
    // Guardar en base de datos (ejemplo con PostgreSQL)
    await db.query(
      'INSERT INTO users (username, password_hash) VALUES ($1, $2)',
      [username, passwordHash]
    );
    
    res.json({ success: true, message: 'Usuario registrado' });
  } catch (error) {
    console.error('Error en registro:', error);
    res.status(500).json({ error: 'Error interno del servidor' });
  }
});

// Login de usuario
app.post('/api/login', ensureQuantumReady, async (req, res) => {
  try {
    const { username, password } = req.body;
    
    // Obtener hash de la base de datos
    const result = await db.query(
      'SELECT password_hash FROM users WHERE username = $1',
      [username]
    );
    
    if (result.rows.length === 0) {
      return res.status(401).json({ error: 'Credenciales inválidas' });
    }
    
    const storedHash = result.rows[0].password_hash;
    
    // Verificar password
    const isValid = quantum_ark_verify(password, APP_KEY, storedHash);
    
    if (isValid) {
      // Crear sesión, JWT, etc.
      const token = generateJWT(username);
      res.json({ success: true, token });
    } else {
      res.status(401).json({ error: 'Credenciales inválidas' });
    }
  } catch (error) {
    console.error('Error en login:', error);
    res.status(500).json({ error: 'Error interno del servidor' });
  }
});

app.listen(3000, () => {
  console.log('🚀 Servidor ejecutándose en http://localhost:3000');
});

Python + Flask (usando subprocess)

import subprocess
import json
from flask import Flask, request, jsonify

app = Flask(__name__)

def quantum_hash(password, key):
    """Llama al CLI de Quantum Ark desde Python"""
    result = subprocess.run(
        ['node', 'quantum_ark_wrapper.js', 'hash', password, key],
        capture_output=True,
        text=True
    )
    return result.stdout.strip()

def quantum_verify(password, key, stored_hash):
    """Verifica password usando Quantum Ark"""
    result = subprocess.run(
        ['node', 'quantum_ark_wrapper.js', 'verify', password, key, stored_hash],
        capture_output=True,
        text=True
    )
    return result.stdout.strip() == 'true'

@app.route('/api/register', methods=['POST'])
def register():
    data = request.json
    password = data.get('password')
    username = data.get('username')
    
    if not password or len(password) < 8:
        return jsonify({'error': 'Password muy corto'}), 400
    
    # Generar hash
    password_hash = quantum_hash(password, app.config['QUANTUM_KEY'])
    
    # Guardar en DB (ejemplo)
    # db.save_user(username, password_hash)
    
    return jsonify({'success': True})

@app.route('/api/login', methods=['POST'])
def login():
    data = request.json
    password = data.get('password')
    username = data.get('username')
    
    # Obtener hash de DB
    # stored_hash = db.get_user_hash(username)
    
    if quantum_verify(password, app.config['QUANTUM_KEY'], stored_hash):
        return jsonify({'success': True, 'token': 'JWT_TOKEN'})
    else:
        return jsonify({'error': 'Credenciales inválidas'}), 401

if __name__ == '__main__':
    app.config['QUANTUM_KEY'] = 'tu_clave_secreta_aqui'
    app.run(debug=True)

Archivo auxiliar quantum_ark_wrapper.js:

const init = require('quantum_ark').default;
const { quantum_ark_hash_with_hmac, quantum_ark_verify } = require('quantum_ark');

async function main() {
  await init();
  
  const [,, action, password, key, storedHash] = process.argv;
  
  if (action === 'hash') {
    const hash = quantum_ark_hash_with_hmac(password, key);
    console.log(hash);
  } else if (action === 'verify') {
    const isValid = quantum_ark_verify(password, key, storedHash);
    console.log(isValid);
  }
}

main();

📚 Ejemplos Avanzados

1. Sistema de Reset de Password

import init, { quantum_ark_hash_with_hmac } from 'quantum_ark';

await init();

async function resetPassword(userId, newPassword, resetToken) {
  // Validar token de reset
  const isValidToken = await validateResetToken(userId, resetToken);
  if (!isValidToken) throw new Error('Token inválido o expirado');
  
  // Generar nuevo hash
  const newHash = quantum_ark_hash_with_hmac(
    newPassword, 
    process.env.QUANTUM_KEY
  );
  
  // Actualizar en base de datos
  await db.query(
    'UPDATE users SET password_hash = $1, reset_token = NULL WHERE id = $2',
    [newHash, userId]
  );
  
  return { success: true };
}

2. Migración desde otro sistema de hash

import init, { quantum_ark_hash_with_hmac, quantum_ark_verify } from 'quantum_ark';
import bcrypt from 'bcrypt';

await init();

async function migrateUserHash(username, plainPassword) {
  // Obtener hash antiguo (bcrypt)
  const oldHash = await db.getUserHash(username);
  
  // Verificar con sistema antiguo
  const isValidOld = await bcrypt.compare(plainPassword, oldHash);
  
  if (isValidOld) {
    // Generar nuevo hash con Quantum Ark
    const newHash = quantum_ark_hash_with_hmac(
      plainPassword, 
      process.env.QUANTUM_KEY
    );
    
    // Actualizar en base de datos
    await db.query(
      'UPDATE users SET password_hash = $1, hash_type = $2 WHERE username = $3',
      [newHash, 'quantum_ark', username]
    );
    
    console.log(`✅ Usuario ${username} migrado a Quantum Ark`);
  }
}

// Login con soporte de migración automática
async function loginWithMigration(username, password) {
  const user = await db.getUser(username);
  
  if (user.hash_type === 'bcrypt') {
    // Validar con bcrypt
    const isValid = await bcrypt.compare(password, user.password_hash);
    
    if (isValid) {
      // Migrar automáticamente en el login
      await migrateUserHash(username, password);
      return { success: true, migrated: true };
    }
  } else if (user.hash_type === 'quantum_ark') {
    // Validar con Quantum Ark
    const isValid = quantum_ark_verify(
      password, 
      process.env.QUANTUM_KEY, 
      user.password_hash
    );
    return { success: isValid, migrated: false };
  }
  
  return { success: false };
}

3. Múltiples niveles de seguridad

import init, { 
  quantum_ark_hash, 
  quantum_ark_hash_with_hmac, 
  quantum_ark_hash_extreme 
} from 'quantum_ark';

await init();

const SECURITY_LEVELS = {
  STANDARD: 'standard',    // Usuarios normales
  HIGH: 'high',           // Cuentas premium
  CRITICAL: 'critical'    // Administradores
};

function getHashFunction(securityLevel) {
  switch(securityLevel) {
    case SECURITY_LEVELS.STANDARD:
      return quantum_ark_hash;
    case SECURITY_LEVELS.HIGH:
      return quantum_ark_hash_with_hmac;
    case SECURITY_LEVELS.CRITICAL:
      return quantum_ark_hash_extreme;
    default:
      return quantum_ark_hash_with_hmac;
  }
}

async function registerUserWithLevel(username, password, level) {
  const hashFn = getHashFunction(level);
  const hash = hashFn(password, process.env.QUANTUM_KEY);
  
  await db.query(
    'INSERT INTO users (username, password_hash, security_level) VALUES ($1, $2, $3)',
    [username, hash, level]
  );
}

// Uso:
await registerUserWithLevel('[email protected]', 'adminPass', SECURITY_LEVELS.CRITICAL);
await registerUserWithLevel('[email protected]', 'userPass', SECURITY_LEVELS.STANDARD);

🎯 Casos de Uso Reales

E-Commerce

// Hash de passwords de clientes
const customerHash = quantum_ark_hash_with_hmac(password, SHOP_SECRET_KEY);

// Verificación en checkout
if (quantum_ark_verify(inputPassword, SHOP_SECRET_KEY, storedHash)) {
  proceedToPayment();
}

Banking / Fintech

// Máxima seguridad para cuentas bancarias
const accountHash = quantum_ark_hash_extreme(password, BANK_SECRET_KEY);

// Doble verificación con 2FA
if (quantum_ark_verify(password, BANK_SECRET_KEY, hash) && verify2FA(code)) {
  grantAccess();
}

Healthcare (HIPAA Compliant)

// Acceso a registros médicos
const doctorHash = quantum_ark_hash_with_hmac(password, HOSPITAL_KEY);

// Auditoría de accesos
logAccess({
  user: doctorId,
  timestamp: Date.now(),
  hashUsed: 'quantum_ark_v2h',
  success: quantum_ark_verify(password, HOSPITAL_KEY, storedHash)
});

🔄 Actualizaciones y Changelog

v0.2.0 (2025) - Última Versión

  • ✅ Algoritmo mejorado con mayor resistencia cuántica
  • ✅ Rendimiento optimizado (30% más rápido)
  • ✅ Compatibilidad mejorada con Vite y Webpack 5
  • ✅ Nuevas funciones: quantum_ark_hash_extreme, quantum_ark_generate_salt
  • ✅ Retrocompatibilidad completa con v0.1.x

v0.1.7

  • Primera versión pública estable
  • Soporte básico para quantum_ark_hash y quantum_ark_verify

📞 Soporte y Comunidad


🙏 Contribuciones

Quantum Ark acepta contribuciones en:

  • 📝 Mejoras en documentación
  • 🐛 Reportes de bugs detallados
  • 💡 Sugerencias de features
  • 🧪 Casos de prueba adicionales
  • 🌍 Traducciones del README

⚠️ Advertencia Legal

USO RESPONSABLE: Este software está diseñado para proteger datos sensibles. El uso indebido (ingeniería inversa, modificación del WebAssembly sin autorización, o intentos de comprometer la seguridad) puede violar leyes locales e internacionales de ciberseguridad.

GARANTÍA: Este software se proporciona "TAL CUAL", sin garantías de ningún tipo, expresas o implícitas. El uso en producción es responsabilidad exclusiva del implementador.

CUMPLIMIENTO: Los desarrolladores deben asegurar el cumplimiento de regulaciones aplicables (GDPR, HIPAA, PCI-DSS, etc.) en sus jurisdicciones.


📜 Licencia

GPL-3.0 - General Public License v3.0

Este proyecto es software libre. Puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de GNU versión 3 publicada por la Free Software Foundation.

Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR.

Ver el archivo LICENSE para más detalles.


🌟 Desarrollado por

Joel Andres - Cryptographic Security Specialist


Quantum Ark - Security Beyond Tomorrow 🛡️

Protegiendo el presente, preparados para el futuro cuántico

npm downloads license