Sto progettando un'architettura software e ho bisogno di suggerimenti e chiarimenti su alcuni problemi.
Questa sarà un'API RESTfull lato server per l'accesso ai dati e più client mobili / desktop per accedere all'API, raccogliere alcuni dati e beni digitali da consumare nei client. Sarà accessibile tramite HTTPS
I client saranno iOS (Swift 2), Android (Java), Windows Phone (C #), Windows (C #), Windows Store (C #), Mac (Swift 2), Web (C # / JavaScript / HTML), Linux (Il linguaggio di programmazione non è ancora chiaro)
Il linguaggio di programmazione delle applicazioni lato server sarà C # su .Net Framework 4.6 e verrà eseguito su Azure
I client possono essere eseguiti su un computer (MAC, PC, Linux), browser, smartphone o tablet (iOS, Android, Windows Phone, Windows Store)
I client effettueranno l'autenticazione al servizio REST utilizzando oAuth 2, quindi il membro effettuerà l'autenticazione utilizzando il nome utente e la password. L'ID univoco del membro verrà archiviato nel database del cliente per l'autenticazione e la richiesta all'API per gli ulteriori passaggi / richieste poiché non sarà richiesto alcun accesso se il membro si disconnette intenzionalmente.
Quando la richiesta del membro da API ci sarà un processo di download per file digitali di medie dimensioni (come pdf o file video di circa 200 mb). I file verranno crittografati sul server per decodificare sul client mentre sta consumando. Ciò significa che decodificheremo i prodotti digitali in fase di runtime, quindi nessun file verrà archiviato nel client decrittografato. Quindi la mia decrittografia deve essere molto veloce e con un basso consumo di risorse, ma sicuro.
I membri saranno autorizzati a registrare -let dicono 3 dispositivi per utilizzare il software client
I dispositivi client verranno registrati automaticamente quando il membro utilizza per la prima volta l'app sul dispositivo.
I file devono essere consumati nel client se il cliente è registrato, il membro è valido e il prodotto digitale viene acquistato dal membro. Nessun altro utente o qualsiasi altro software non sarà in grado di consumare prodotti.
Ecco il mio approccio iniziale per implementare i requisiti di cui sopra nel software in modo da poter proteggere i prodotti e il sistema:
I could not managed to enter all my explanations in here because form was saying this is a spam. that is why i have add a link below so you can find all my notes in there
Ecco le mie domande;
- Terrò la password dei miei membri nel database con l'hash SHA-512. Userò SALT per la password. Quindi terrò le chiavi SALT nel database per ogni membro. È sicuro e va bene implementarlo in questo modo?
- Devo tenere IV (Initialization Vector) nel database per ciascun prodotto in modo da poterlo utilizzare per la crittografia? Se è così ho bisogno di esporlo tramite la mia API in modo che il client possa ottenerlo per decrittografarlo. È sicuro esporre?
- Quale algoritmo di crittografia e hash è meglio usare in ambienti diversi senza problemi. Decreterò i file in iOS, Android, Windows Phone, Windows, Mac, ecc. Tutto nativo lo so da un amico che ha usato AES-128 e MD5 sul server per crittografare, ma ha affrontato molti problemi su diversi client quando ha provato a decodificare file.
- Sto pensando di utilizzare AES-256 (modalità di cifratura: CBC, modalità di riempimento: PKCS7, con IV) e SHA-512. Qualche commento su questa scelta?
- Memorizzerò 2 diverse password di convalida e 2 password di crittografia diverse nel database, così posso usarla con AES e SHA-512. Ma ho bisogno di memorizzare le stesse password nel codice client come testo hardcoded in modo da poter decodificare il prodotto. Ma questa password può essere rubata per de-offuscarla. Qual è il modo migliore per mantenere questa password 4 nell'ambiente client e altre informazioni importanti sul client?
- Quando pubblico iOS, Android e Windows Phone, Windows Store, app Mac sui mercati, vengono automaticamente offuscati e firmati. Firmerò manualmente e offuscerò la mia Applicazione Windows. È sufficiente proteggere il mio codice contro persone curiose?
- Sto utilizzando alcuni dati per crittografare o file hash o informazioni. Devo esporre i dati tramite API in modo che i miei clienti possano ottenerli e usarli per la decrittografia. È sicuro farlo? C'è un altro modo per farlo?
- Qualche suggerimento sull'architettura che spiego sopra? Prevedi qualsiasi tipo di vulnerabilità sull'approccio?
PS: posso dare maggiori dettagli se abbiamo bisogno di chiarire qualsiasi cosa.