Per favore, sopportami perché non sono un esperto in sicurezza. Ho un server e un client. Sul server sto crittografando un messaggio molto segreto (utilizzando AES256-GCM per nascondere le informazioni e proteggerne l'integrità) che invierò al client. Il client però non decodificherà mai questo messaggio, lo riceverà solo dal server e lo rimanderà al server con le sue richieste. Il mio server decodificherà e riceverà il messaggio segreto di cui ha bisogno per elaborare altre informazioni. Devo assicurarmi che il cliente non sappia mai dei contenuti all'interno del messaggio. Sto usando javascript (NodeJS) per il mio codice server e sembra questo (spero sia facile da leggere e facile da capire):
var crypto = require('crypto'); //get crypto library
var algorithm = 'aes-256-gcm'; // select which algorithm I want to use
var password = '3zTvzr3p67VC61jmV54rIYu1545x4TlY'; //Random generated 256bit key
function encrypt(text) {
var iv = crypto.randomBytes(128) // generate a random 128bit iv for every encryption
var cipher = crypto.createCipheriv(algorithm, password, iv)
var encrypted = cipher.update(text, 'utf8', 'hex')
encrypted += cipher.final('hex');
var tag = cipher.getAuthTag();
var enc = {
content: encrypted,
tag: tag.toString('hex')
};
sendToClientOverInternet(enc,iv); //send the encrypted content + the iv to client over the internet
}
function decrypt(encrypted) {
var decipher = crypto.createDecipheriv(algorithm, password, iv)
decipher.setAuthTag(new Buffer(encrypted.tag, 'hex'));
var dec = decipher.update(encrypted.content, 'hex', 'utf8')
dec += decipher.final('utf8');
return dec;
}
Sono preoccupato più del processo e dei metodi di crittografia che si oppongono alla sicurezza dell'infrastruttura. Con questo, si assume che il mio server sia completamente sicuro e che la password codificata nel mio codice non sia mai accessibile e che il trasporto di dati su Internet sia limitato a ssl.
Il mio codice con le mie domande:
1) Per prima cosa ho generato una chiave di 32 byte globale sicura in modo casuale.
D: Questa è la taglia corretta? Un modo per migliorare la chiave?
2) Ho un metodo di crittografia che prende del testo e lo crittografa utilizzando AES256-GCM. Quindi prende questo oggetto crittografato e insieme al iv (128 bit di sicurezza generato casualmente per ogni messaggio) lo invia al client. Il cliente se volesse allora potrebbe ora vedere questo oggetto criptato e il iv.
D: È necessaria la protezione dell'integrità dei dati utilizzando GCM? Se io uso CTR invece non sarebbe impossibile per l'hacker decifrare e cambiare il messaggio comunque senza la chiave? Quindi GCM 'overkill'? L'invio di iv e il suo accesso all'utente sono sicuri? Un 128 bit iv abbastanza lungo? Qualche grande miglioramento che posso apportare qui?.
3) Ho un metodo di decrittografia che accetta la mia stringa crittografata e la decrittografa.
D: (Non penso che qui debba essere migliorato qualcosa).
Qualsiasi miglioramento o suggerimento sarebbe molto apprezzato.