Lavoro da tempo su un mio progetto per animali domestici: un'applicazione per appunti simile a Evernote con la differenza che tutto il contenuto è crittografato lato client. Mi piacerebbe avere un feedback su alcune descrizioni architettoniche che ho fatto finora.
Registrazione utente: client
- L'utente fornisce email e una password
- Il client genera una Content Encryption Key (CEK) casuale utilizzando un generatore di numeri casuali crittografici. Questa chiave è utilizzata per crittografare tutti i contenuti degli utenti, inclusi contenuti di testo e risorse multimediali come immagini, audio, ecc. Se questa chiave non esistesse come livello intermedio, la modifica della password di un utente comporterebbe una nuova crittografia di tutto il contenuto.
- Ricavare una chiave per crittografare il CEK utilizzando:
- var input = padToMaxLength (email) + password;
- var salt = SHA512 (input)
- var contentKeyEncryptionKey = PBKDF2 (input, salt, 10000)
- Cripta il CEK utilizzando contentKeyEncryptionKey derivato nel passaggio precedente
- var encryptedContentKey = AES256 (CEK, contentKeyEncryptionKey) (preceduto da HMAC-256 su encryptedContentKey )
- Ricava un token di autenticazione del server con
- var input = contentKeyEncryptionKey;
- var salt = SHA512 (padToMaxLength (email) + password)
- var authToken = PBKDF2 (input, salt, 10000)
Registrazione utente: server
- Il server riceve una richiesta contenente:
- encryptedContentKey
- authToken
-
Genera un unico sale per utente a 256 bit utilizzando un generatore di numeri casuali crittografici
-
Genera un token di autenticazione lato server usando:
- var serverSideAuthToken = PBKDF2 (authToken, salt, 100000)
-
Memorizza email, serverSideAuthToken e encryptedContentKey nel database
Autenticazione
- Il client calcola token di autenticazione del server come descritto sopra e lo passa insieme al messaggio di posta elettronica dell'utente al server
- Il server calcola PBKDF2 (authToken, saltFromDatabase, 100000). L'utente è autenticato se Email e corrispondenze token derivate.
Nota: mi rendo conto che l'uso di email + password per la salatura è tutt'altro che ideale.