Member feedback: keys stored in plaintext in the portal DB are a key-compromise incident waiting to happen. Members.key_token (the chat key) is now encrypted with AES-256-GCM using a KEK from the PORTAL_KEK env var. Plaintext exists only in memory when a key is served (dashboard, LibreChat key feed, LiteLLM management). Startup migration encrypts existing rows idempotently; fail-closed when the KEK is absent. Member-managed API keys were already reveal-once (hash-only at rest).
9 lines
145 B
Plaintext
9 lines
145 B
Plaintext
fastapi==0.115.0
|
|
uvicorn[standard]==0.30.6
|
|
httpx==0.27.2
|
|
pydantic==2.9.2
|
|
PyJWT==2.9.0
|
|
slowapi==0.1.9
|
|
psycopg2-binary==2.9.9
|
|
cryptography==44.0.2
|