Files
PassKeeper/migrations/versions/g7h8i9j0k1l2_encrypt_shared_item_name.py

46 lines
1.4 KiB
Python

"""encrypt shared item name — add enc_name/iv_name to shared_items
Revision ID: g7h8i9j0k1l2
Revises: f6a7b8c9d0e1
Create Date: 2026-05-18 00:00:00.000000
Prior to this migration, shared_items.item_name stored the plaintext display
name of the shared vault item (e.g. "Chase Bank"), leaking it to anyone with
DB read access and contradicting the zero-knowledge architecture.
After this migration:
- enc_name : AES-256-GCM ciphertext of the item name, encrypted with the
ECDH shared secret (same key used for enc_data). Base64.
- iv_name : 12-byte GCM nonce for enc_name. Base64.
- item_name : Repurposed as a non-sensitive fallback label (item_type string,
e.g. "password"). Existing rows keep their current value;
new rows set item_name = item_type.
Both new columns are nullable so existing rows are not affected before the
application writes enc_name/iv_name on the next share operation.
"""
from alembic import op
import sqlalchemy as sa
revision = 'g7h8i9j0k1l2'
down_revision = 'f6a7b8c9d0e1'
branch_labels = None
depends_on = None
def upgrade():
op.add_column(
'shared_items',
sa.Column('enc_name', sa.String(512), nullable=True),
)
op.add_column(
'shared_items',
sa.Column('iv_name', sa.String(64), nullable=True),
)
def downgrade():
op.drop_column('shared_items', 'iv_name')
op.drop_column('shared_items', 'enc_name')