Files
sshkeyvault/package.json
T
florian.wildeandClaude Opus 5.5 6b20566676 feat: OpenSSH-Schluessel erzeugen, schreiben und lesen (#006)
Private Keys sollen nie als Datei auf dem sshkv-Server liegen, auch nicht
kurz. ssh-keygen braucht aber genau das. Deshalb erzeugt Node crypto die
Schluessel (ed25519, RSA-4096), und ein eigener Serializer schreibt das
Format openssh-key-v1 – unverschluesselt oder mit aes256-ctr und
bcrypt_pbkdf (16 Runden, 16 Byte Salt), Checkint und Padding wie OpenSSH.

Der Parser liest auch von ssh-keygen erzeugte Dateien, prueft, dass
Private und Public Key zusammengehoeren, und meldet fehlende oder falsche
Passphrasen ueber eigene Codes. Fehlermeldungen sind feste Saetze ohne
Eingabe darin, damit kein Schluesselmaterial in Logs geraet. RSA unter
2048 Bit wird beim Import abgelehnt; wer nur beobachtet, kann die Grenze
ausschalten.

Die Tests pruefen beide Richtungen gegen das echte ssh-keygen (-y, -lf).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 09:16:42 +02:00

92 lines
2.9 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"name": "sshkv",
"version": "0.0.0",
"private": true,
"type": "module",
"description": "SSHKeyVault – zentrale Verwaltung von SSH-Schluesseln mit Weboberflaeche",
"packageManager": "pnpm@12.6.0",
"engines": {
"node": ">=24"
},
"scripts": {
"dev": "next dev -p 3400",
"build": "next build",
"build:worker": "esbuild src/worker/index.ts --bundle --platform=node --target=node24 --format=esm --outfile=dist/worker.mjs --banner:js=\"import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);\" --external:@prisma/client --external:@node-rs/argon2 --external:pg-native --external:ssh2 --external:cpu-features",
"start": "next start -p 3400",
"worker": "tsx src/worker/index.ts",
"lint": "eslint",
"typecheck": "tsc --noEmit",
"format": "prettier --write .",
"format:pruefen": "prettier --check .",
"test": "vitest run",
"test:watch": "vitest",
"test:integration": "vitest run --config vitest.integration.config.mts",
"db:up": "docker compose -f docker-compose.dev.yml up -d --wait",
"db:down": "docker compose -f docker-compose.dev.yml down",
"db:migrate": "prisma migrate dev",
"db:seed": "prisma db seed",
"db:generate": "prisma generate",
"issues:sync": "tsx scripts/gitea-issues.ts",
"icons": "node scripts/icons.mjs",
"postinstall": "prisma generate",
"prepare": "husky"
},
"lint-staged": {
"*.{ts,tsx,mts,mjs}": [
"eslint --fix",
"prettier --write"
],
"*.{json,css,yml,yaml}": [
"prettier --write"
]
},
"dependencies": {
"@fontsource/ibm-plex-sans": "^5.3.0",
"@fontsource/jetbrains-mono": "^5.3.0",
"@fontsource/space-grotesk": "^5.3.0",
"@node-rs/argon2": "^2.2.2",
"@prisma/adapter-pg": "7.10.0",
"@prisma/client": "7.10.0",
"bcrypt-pbkdf": "^1.0.2",
"clsx": "^2.1.1",
"jose": "^6.2.12",
"lucide-react": "1.47.0",
"next": "16.3.6",
"openid-client": "^6.8.8",
"pg": "^8.23.1",
"pg-boss": "^12.37.1",
"qrcode": "^1.5.4",
"react": "19.3.0",
"react-dom": "19.3.0",
"ssh2": "^1.17.0",
"zod": "^4.6.5"
},
"devDependencies": {
"@commitlint/cli": "^21.2.3",
"@commitlint/config-conventional": "^21.2.3",
"@playwright/test": "1.63.0",
"@tailwindcss/postcss": "^4.3.3",
"@types/node": "^24.19.2",
"@types/pg": "^8.23.1",
"@types/qrcode": "^1.5.6",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
"@types/ssh2": "^1.15.6",
"dotenv": "^18.0.7",
"esbuild": "^0.28.2",
"eslint": "^9.39.5",
"eslint-config-next": "16.3.6",
"eslint-config-prettier": "^10.1.8",
"husky": "^9.1.7",
"lint-staged": "^17.6.0",
"prettier": "^3.9.10",
"prisma": "7.10.0",
"sharp": "^0.35.5",
"tailwindcss": "^4.3.3",
"tsx": "^4.23.15",
"typescript": "~6.0.3",
"vite": "8.3.0",
"vitest": "5.0.1"
}
}