Come minimizzare i rischi per la sicurezza quando si deve lavorare con password decodificate (testo normale) a causa della progettazione di API di terze parti

3

Sto sviluppando un'applicazione (C #) per la piattaforma Microsoft SharePoint che utilizza la tecnologia RBS (Remote BLOB Storage) di SQL Server (2008 R2). Per eseguire determinate attività lato client, devo ottenere una coppia nome utente / password dal database e passarla a un costruttore che assomiglia a questo ( MSDN ):

public BlobStoreCredentials(string credentialName, byte[] credentialSecret)

Tieni presente che credentialSecret prevede una password decrittografata ; la password viene crittografata internamente dopo la chiamata del costruttore.

Microsoft, per ragioni a me sconosciute, by-design memorizza le password RBS che posso alimentare al costruttore precedente crittografato simmetricamente nel database, con la chiave di crittografia memorizzata nello stesso database (per creare / inserire le password, viene utilizzata una stored procedure fornita da Microsoft che accetta una password in testo semplice). Da quel poco che so sulla sicurezza, questo è no-go, corretto?

Per ottenere un byte[] credentialSecret valido, apparentemente si suppone che utilizzi una query simile a questa e che restituisca nome utente e password decifrata:

OPEN SYMMETRIC KEY skey
DECRYPTION BY CERTIFICATE cert;

SELECT [username], CONVERT(nvarchar, DecryptByKey(password)) 
FROM [credentials] 
WHERE [id]=@userId;

Posso quindi alimentare la password decrittografata al costruttore (lato client) che la crittografa internamente, la utilizza per eseguire alcune attività e dispone le credenziali alla fine (vedere il codice di esempio MSDN sopra).

Mi sembra che molte cose abbiano torto in questo progetto. Anche se avessi deciso di distribuire un database ortogonale personalizzato per archiviare solo le password hash unidirezionali, a un certo punto dovrei "decodificarle" in testo semplice per inviarle al costruttore sopra.

La mia domanda è: ci sono modi per minimizzare ragionevolmente problemi di sicurezza con questo approccio accettando la premessa della domanda (cioè ho bisogno di passare credenziali decifrate al costruttore), o questo disegno è intrinsecamente così insicuro che è al di là del miglioramento? Non è solo l'aspetto tecnico, ma anche come comunicare situazioni come questa al datore di lavoro e come reagire (in quanto non di sicurezza) in generale quando si ha a che fare con una situazione che mi costringe a usare un cattivo design di sicurezza? La soluzione che ho presentato ovviamente funziona, ma è - per quanto ne so - una cattiva sicurezza, per non dire che assomiglia a un dispositivo Rube Goldberg.

(Mi scuso se questa domanda non è abbastanza specifica per questo sito, ma non so dove altro valuti le mie opzioni.)

    
posta w128 15.04.2014 - 14:29
fonte

1 risposta

1

Non ho usato queste tecnologie prima, ma quello che posso dire è se decifri la password nella tua query SQL, quindi chiunque sulla tua rete può annusare e ottenere le password come testo normale.

Se ho capito bene, il tuo C # otterrà le password decodificate? Se è così, ti consiglio di avere qualcosa come nell'applicazione C #:

  1. C # genera una chiave casuale (utilizzata per il sale nella crittografia) e invia sale alla stored procedure in SQL.
  2. La stored procedure crittograferà la password in base a salt (dal client)
  3. C # lo decrittografa in base alla chiave salt fornita

L'hacker sarebbe in grado di decrittografarlo, se ha ottenuto il sale casuale e il reverse engineering del tuo C # (che è molto facile a causa dei bytecodes), ma almeno non è un semplice testo o una crittografia statica e molto meglio del tuo semplice -text.

    
risposta data 15.04.2014 - 15:20
fonte