@dotrino/passmanager

中文文档
0.18.6发布于 2026/10/26MITES Module零依赖构建来源已验证近 30 天下载 5219

Modelo de bóveda, cifrado e interfaz de credenciales del gestor de contraseñas de Dotrino

原始使用文档
文档目录4 节
  1. Las dos puntas
  2. Qué más trae
  3. Dos reglas que el código hace cumplir
  4. Documentación

@dotrino/passmanager

Parte del ecosistema Dotrino. Dotrino es un ecosistema de aplicaciones centradas en la privacidad de los datos: tu información es tuya, y las decisiones sobre ella también — qué compartes, con quién, cuándo y por qué. Sin anuncios, sin cookies, sin rastreo de datos, sin vender tu identidad a nadie.

El modelo de datos, el cifrado y las dos puntas del gestor de contraseñas de Dotrino: la bóveda que custodia y el aparato que pide.

La idea que lo ordena: el aparato pide una credencial por dominio y recibe esa sola. Nunca la bóveda entera. Un compromiso del navegador no es un compromiso total.

npm install @dotrino/passmanager

Las dos puntas

import { LocalVault, VaultResponder } from '@dotrino/passmanager'

// Donde vive la bóveda: tiene la llave, guarda, y decide quién puede pedir.
const vault = new LocalVault(store)
vault.unlock(cek)

new VaultResponder({
  client,                                   // @dotrino/proxy-client, ya identificado
  vault,
  isAllowed: pub => misAparatos.has(pub),   // por defecto NADIE
  needsApproval: op => op === 'get',        // una vez por aparato, no por credencial
  approve: async ({ pubkey }) => preguntarAlUsuario(pubkey),
  encPubOf: pub => llaveDeCifradoDe(pub),
  onRequest: apuntarEnLaBitacora,
}).start()
import { RemoteVault, ProxyTransport } from '@dotrino/passmanager'

// Quien pide: no tiene la llave y NO puede listar.
const remota = new RemoteVault(new ProxyTransport({ client, peerPubkey, peerEncPub }))

const hay = await remota.find('https://salesforce.com/')  // metadatos, sin secretos
const una = await remota.get(hay[0].id)                    // UNA credencial
await remota.list()                                        // ✗ falla: no-key, a propósito

list() no está para el aparato, y esa ausencia es el diseño: si pudiera listarlo todo, el «de a una» sería decorativo.

import { LocalVault, GuardedVault, ApprovalGate } from '@dotrino/passmanager'

// Una bóveda LOCAL que además pide autorización: es lo que usa la extensión, donde no
// hay transporte de por medio y por tanto nadie le ponía la puerta.
const gate = new ApprovalGate({ ask: ({ payload }) => preguntarleAlUsuario(payload) })
const vault = new GuardedVault(new LocalVault(store), { gate })

await vault.find(url)                        // público: no pregunta
await vault.get(id, { keys: ['email'] })     // un dato público: tampoco
await vault.get(id, { keys: ['secret'] })    // privado: pide autorización
await vault.patch(id, { fields: [...] })     // escribir no saca nada: no pregunta

get devuelve solo los campos que se piden, y solo pregunta si alguno es privado: la contraseña, el código de dos pasos, las notas, una passkey, o un campo que el usuario marcó. patch fusiona dentro de la bóveda, así que actualizar una entrada ya no exige leerla entera —que era lo que obligaba a autorizar para reemplazar un nombre, y lo que la dejaba a medias si esa lectura no salía—.

La puerta es la misma pieza que usa VaultResponder, y por eso las tres bóvedas del gestor se comportan igual: el sí se recuerda (o no, según con qué llave), el no nunca se recuerda, y dos peticiones a la vez producen un solo aviso.

Y como abrir una entrada cuesta una autorización, find y search traen además un resumen de cada campo —públicos y privados, un solo método— con un nonce nuevo en cada respuesta, para poder decir «esto ya está guardado igual» sin abrir nada:

const [hit] = await vault.find('https://salesforce.com/')
const hash = await fieldHasher(hit.nonce)
const igual = await hash('secret', loQueEscribio) === hit.fieldHashes.secret

El resumen dice si es igual, no qué era: para eso hay que abrir la entrada. Y no se reparte más allá de quien compara — con un valor corto y de forma conocida (un teléfono, un documento), tenerlo delante es poder adivinarlo.

Qué más trae

sealEntry / openEntrycifrado por entrada, con el AAD atando cada criptograma a su campo
findForUrl / matchSiteemparejamiento por etiquetas de dominio, nunca por sufijo de cadena
totpNowcódigos de dos pasos (RFC 6238), y acepta el secreto pelado de Bitwarden
importAuto1Password, Bitwarden (CSV y JSON) y Chrome
generatePasswordgenerador sin sesgo de reparto
normalizeFieldscampos libres { label, value, kind }
SessionCacherecuerdo en memoria de lo ya entregado
GuardedVault / ApprovalGatela puerta de autorización, delante de cualquier bóveda
privateKeysOfqué campos de una entrada son privados: los marcados y los que lo son siempre
entryFieldKeys / entryFieldValuesqué campos lleva una entrada, por su nombre
makeNonce / fieldHasherlos resúmenes con los que se compara sin abrir la entrada

Dos reglas que el código hace cumplir

Nada viaja en claro. El proxio enruta pero no cifra: sin sellar, vería a qué sitio se le pide credencial y cuál se devuelve. Va sellado con @dotrino/proxy-client ≥ 0.13.0, y lo que llega sin sellar se rechaza — sellar solo de salida no sirve de nada si la otra punta acepta texto plano.

Una entrada sin sites sirve en cualquier parte. Así se guarda el correo o la cédula, sin un tipo aparte y con una sola regla de emparejamiento.

Documentación

Diseño completo, con lo decidido y lo descartado, en docs/DISENO.md.

版本与发布记录

@dotrino/passmanager 共发布 28 个版本,首次发布于 2026/08/26;过去 12 个月发布了 28 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.18.6latest2026/10/2618 天前
0.18.52026/10/1826 天前
0.18.42026/10/1727 天前
0.18.32026/10/1727 天前
0.18.22026/10/1727 天前
0.18.12026/10/1727 天前

关于 @dotrino/passmanager 的常见问题

@dotrino/passmanager 是什么?

Modelo de bóveda, cifrado e interfaz de credenciales del gestor de contraseñas de Dotrino

如何安装 @dotrino/passmanager?

在项目目录运行 npm install @dotrino/passmanager,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@dotrino/proxy-client(>=0.36.1)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@dotrino/passmanager 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/dotrino__passmanager 是否存在。

@dotrino/passmanager 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@dotrino/passmanager 可以商用吗?

@dotrino/passmanager 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@dotrino/passmanager 的下载量有多少?

根据 npm 官方下载统计,@dotrino/passmanager 在 2026/10/13 – 2026/11/11 这 30 天内被下载 5,219 次,日均约 174 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@dotrino/passmanager 还在维护吗?

最新版本 0.18.6 发布于 2026/10/26(18 天前);至今共发布 28 个版本,其中过去 12 个月发布了 28 个;首次发布于 2026/08/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。