PWR Arca
Almacenamiento cifrado con enlaces temporales. Sube archivos cifrados con las 6 capas criptograficas de Cuantica y genera enlaces de descarga con expiracion, limite de descargas y proteccion por password. PHP puro, sin dependencias externas.
Instalacion
Arca depende de Cuantica para el cifrado. Ambos archivos se cargan automaticamente.
require_once __DIR__ . '/core/arca.php';
// cuantica.php se carga automaticamente
Requisitos minimos
- PHP 7.4 o superior
- Extensiones
opensslysodium - Permisos de escritura en
datos/arca/ - Espacio en disco suficiente para los archivos cifrados
Inicio rapido
Sube un archivo, cifralo y genera un enlace temporal de descarga.
require_once 'core/arca.php';
$subida = pwr_arca_subir('/ruta/documento.pdf', 'mi_password');
$enlace = pwr_arca_crear_enlace($subida['id'], 'mi_password');
echo 'Descarga: ' . $enlace['url'];
Funciones
pwr_arca_subir()
Sube y cifra un archivo con las 6 capas de Cuantica. Almacena metadatos en el indice.
pwr_arca_subir(string $ruta_archivo, string $password, array $metadata_extra = []): array
| Parametro | Tipo | Descripcion |
|---|---|---|
$ruta_archivo | string | Ruta absoluta al archivo a subir |
$password | string | Password para cifrar el archivo |
$metadata_extra | array | Metadatos adicionales (etiquetas, descripcion, etc.) |
Retorna: array con ok, id, nombre, tamano, tamano_cifrado.
pwr_arca_descargar()
Descifra y devuelve el contenido de un archivo almacenado.
pwr_arca_descargar(string $id, string $password): array
| Parametro | Tipo | Descripcion |
|---|---|---|
$id | string | ID del archivo en el almacen |
$password | string | Password de descifrado |
Retorna: array con ok, contenido (datos binarios), nombre, mime.
pwr_arca_crear_enlace()
Genera un enlace temporal de descarga con expiracion, limite de descargas y password opcional.
pwr_arca_crear_enlace(string $id, string $password, array $opciones = []): array
| Parametro | Tipo | Descripcion |
|---|---|---|
$id | string | ID del archivo |
$password | string | Password de cifrado del archivo |
$opciones | array | Opciones: expira_horas, max_descargas, password_enlace |
Retorna: array con ok, token, url, expira.
pwr_arca_verificar_enlace()
Verifica si un enlace temporal es valido (no expirado, no superado el limite de descargas).
pwr_arca_verificar_enlace(string $token): array
Retorna: array con ok, archivo_id, descargas_restantes, expira.
pwr_arca_listar()
Lista todos los archivos almacenados con sus metadatos (sin contenido descifrado).
pwr_arca_listar(): array
Retorna: array de archivos, cada uno con id, nombre, tamano, fecha_subida, mime.
pwr_arca_borrar()
Elimina un archivo cifrado y su entrada del indice.
pwr_arca_borrar(string $id): array
Retorna: array con ok y mensaje.
pwr_arca_info()
Devuelve informacion y metadatos de un archivo concreto sin descifrar su contenido.
pwr_arca_info(string $id): array
Retorna: array con metadatos del archivo: id, nombre, tamano, mime, fecha_subida.
pwr_arca_servir_enlace()
Sirve la descarga de un archivo a traves de un enlace temporal. Envia headers HTTP y el contenido descifrado.
pwr_arca_servir_enlace(string $token, string $password_enlace = null): void
| Parametro | Tipo | Descripcion |
|---|---|---|
$token | string | Token del enlace temporal |
$password_enlace | string|null | Password del enlace si fue creado con proteccion |
pwr_arca_estadisticas()
Devuelve estadisticas globales del almacen: total de archivos, espacio usado, enlaces activos.
pwr_arca_estadisticas(): array
Retorna: array con total_archivos, espacio_usado, enlaces_activos, descargas_totales.
Configuracion
Arca utiliza constantes definidas en el propio archivo y rutas de almacenamiento
en datos/arca/. Los metadatos se guardan en datos/arca_index.json
y los enlaces en datos/arca_enlaces.json.
datos/
arca/ // Archivos cifrados
arca_index.json // Indice de metadatos
arca_enlaces.json // Enlaces temporales activos
Ejemplos
Subir y compartir un archivo con enlace protegido
require_once 'core/arca.php';
// Subir archivo cifrado
$subida = pwr_arca_subir('/documentos/contrato.pdf', 'clave_maestra', [
'etiqueta' => 'contratos',
'descripcion' => 'Contrato firmado Q1 2025'
]);
// Crear enlace temporal: 24h, max 3 descargas, con password
$enlace = pwr_arca_crear_enlace($subida['id'], 'clave_maestra', [
'expira_horas' => 24,
'max_descargas' => 3,
'password_enlace' => 'descarga2025'
]);
echo 'Enlace: ' . $enlace['url'];
Listar archivos y obtener estadisticas
require_once 'core/arca.php';
// Listar todos los archivos
$archivos = pwr_arca_listar();
foreach ($archivos as $archivo) {
echo $archivo['nombre'] . ' - ' . $archivo['tamano'] . ' bytes' . "\n";
}
// Estadisticas globales
$stats = pwr_arca_estadisticas();
echo 'Total archivos: ' . $stats['total_archivos'];
echo 'Espacio usado: ' . $stats['espacio_usado'];
Servir descarga desde enlace temporal
require_once 'core/arca.php';
$token = $_GET['t'] ?? '';
$password = $_POST['password'] ?? null;
// Verificar validez del enlace
$valido = pwr_arca_verificar_enlace($token);
if (!$valido['ok']) {
die('Enlace invalido o expirado');
}
// Servir archivo (envia headers + contenido)
pwr_arca_servir_enlace($token, $password);
Borrar archivos antiguos
require_once 'core/arca.php';
$archivos = pwr_arca_listar();
foreach ($archivos as $archivo) {
// Borrar archivos de mas de 30 dias
if (strtotime($archivo['fecha_subida']) < strtotime('-30 days')) {
pwr_arca_borrar($archivo['id']);
}
}