2009-07-21 15 views
14

Sto cercando di utilizzare Amazon S3 e simpleDB in un'applicazione desktop.Memorizzare le mie credenziali Amazon nell'app desktop C#

Il problema principale che ho è che ho bisogno di memorizzare le credenziali di aws nell'applicazione o utilizzare qualche altro schema.

Immagino che archiviarli nell'applicazione sia fuori questione in quanto sarebbero facilmente individuabili.

Un'altra opzione è creare un servizio Web che crea la firma di autenticazione aws ma questo ha i suoi problemi. La firma richiede tutti i dati da un file che viene caricato? In tal caso, dovrei trasferire tutti i dati due volte. Ci sarebbe quindi un punto di errore centrale che era uno dei motivi principali per l'utilizzo di aws.

Qualche idea?

UPDATE:

avevo bisogno di fare un po 'più chiaro che sto volendo conservare le mie credenziali AWS in un'applicazione distribuito agli altri. DPAPI o qualsiasi altra crittografia potrebbero solo impedire alle persone di utilizzare semplicemente Reflector per ottenere le credenziali. L'utilizzo di qualsiasi crittografia richiede ancora la chiave che è facile da ottenere.

UPDATE 2 - Settembre 2011

Amazon hanno rilasciato alcuni dettagli sull'uso del servizio token di sicurezza AWS, che consente l'autenticazione, senza rivelare la vostra chiave segreta. Ulteriori dettagli sono disponibili su this blog post.

risposta

10

Tim, si sta infatti provando con i due approcci principali:

  1. non abbastanza: memorizzare la chiave segreta "di nascosto" in app. In effetti, c'è il grave rischio che qualcuno lo stacchi dal codice dell'app. Alcune mitigazioni potrebbero essere: (a) utilizzare il DPAPI per archiviare la chiave al di fuori dell'app binario, o (b) ottenere la chiave tramite il servizio Web ogni volta che ne hai bisogno (su SSL), ma non memorizzarla mai localmente.Nessuna mitigazione può davvero rallentare un attaccante competente con un debugger, poiché la chiave del cleartext deve finire nella RAM dell'app.

  2. MEGLIO: invia il contenuto che deve essere protetto per il tuo servizio web e firmarlo lì. La buona notizia è che solo il nome della richiesta e il timestamp devono essere firmati - non tutti i bit caricati (credo che Amazon non voglia spendere i cicli per verificare tutti quei bit!). Di seguito sono riportate le linee di codice pertinenti da Amazon "Introduction to AWS for C# Developers". Si noti come Aws_GetSignature viene chiamato solo con "PutObject" e un timestamp? È possibile implementare definitivamente la firma sul proprio servizio Web senza dover inviare l'intero file e senza compromettere la chiave. Nel caso ve lo stiate chiedendo, Aws_GetSignature è una funzione a 9 righe che esegue un hash SHA1 su una concatenazione della stringa costante "AmazonS3", il nome dell'operazione e la rappresentazione RFC822 del timestamp - utilizzando la vostra chiave segreta.

    DateTime timestamp = Aws_GetDatestamp(); 
    string signature = Aws_GetSignature("PutObject", timestamp); 
    byte[] data = UnicodeEncoding.ASCII.GetBytes(content); 
    service.PutObjectInline("MainBucket", cAWSSecretKey, metadata, 
         data, content.Length, null, 
         StorageClass.STANDARD, true, 
         cAWSAccessKeyId, timestamp, true, 
         signature, null); 
    

EDIT: si noti che mentre è possibile mantenere la parte chiave segreta della vostra identità nascosta Amazon, la parte ID chiave di accesso deve essere incorporato nella richiesta. A meno che non si invii il file tramite il proprio servizio Web, sarà necessario incorporarlo nell'app.

+0

Questo è praticamente tutto! Per essere onesti, se i file vengono caricati su Internet, non c'è molto che mi trattiene con un'app desktop. Beh, a parte la mia mancanza di conoscenza asp, e il fatto che è facile fare una bella app in Winforms/WPF – Tim

+0

Great! La tua domanda è perfettamente valida anche per le web app, credo, se vogliono evitare di inviare il file due volte (dal browser alla webapp, poi dalla webapp alla s3). I campioni di Amazon sembrano saltare questa considerazione a volte. Correzione –

+0

: Il secondo parametro di 'PutObjectInline()' è _la chiave da assegnare all'oggetto_, e non 'cAWSSecretKey'. Vedi [doc AWS] (http://docs.amazonwebservices.com/AmazonS3/latest/API/SOAPPutObjectInline.html). – amolbk

0

Il problema principale che ho è che ho bisogno di memorizzare le credenziali di aws nell'applicazione o utilizzare qualche altro schema.

Windows dispone di un servizio a livello di sistema simile a quello di Apple Keychain Manager? Se è così, metti le tue credenziali lì. In caso contrario, è possibile creare una versione annacquata per archiviare una versione crittografata delle credenziali AWS.

La firma richiede tutti i dati da un file che viene caricato?

La firma HMAC SHA-1 è una codifica codificata delle intestazioni delle richieste HTTP. Questa firma è un valore hash e sarà molto breve rispetto ai dati, solo 20 byte.

+0

Il mio punto sulla firma era che se avessi inviato un file, avrei dovuto inviare tutto al servizio web solo per generare la firma? – Tim

+0

No, si genera la firma sulla propria estremità. Generano la loro firma sul loro capo e quindi confrontano la loro firma con la vostra. Se le due firme non corrispondono, la richiesta non riesce. Le firme devono corrispondere per autenticare e autorizzare la tua richiesta. –

0

È possibile crittografare il file di configurazione e/o utilizzare ProtectedData. Here's my blog post on both.

AGGIORNAMENTO: potrebbe essere necessario crittografare app.config come parte di un passaggio di installazione. Esempio: http://www.codeproject.com/KB/security/encryptstrings.aspx. Non eccezionale, ma il migliore che ho trovato finora.

+0

DPAPI è utile solo per proteggere i dati degli utenti, ho bisogno di memorizzare le mie credenziali personali! – Tim

0

Permetterai a chiunque entri in possesso di una copia del tuo programma di accedere ai dati su S3/SimpleDB? In caso contrario, sarà necessario il proprio schema di autenticazione indipendente dalla sicurezza AWS.

In tal caso, è possibile implementare un servizio Web che accetta le credenziali fornite ai clienti (un nome utente/password, ad esempio un certificato digitale, ecc.) E quindi esegue le operazioni S3/SimpleDB richieste dal programma. In questo modo, le credenziali di AWS non abbandonano mai AWS. Se le credenziali di un determinato utente sono compromesse, è possibile annullare tali credenziali nel proprio servizio web.

Problemi correlati