2009-07-21 3 views
14

Ich suche Amazon S3 und simpleDB in einer Desktop-Anwendung.Meine Amazon-Anmeldeinformationen in C# Desktop-App speichern

Das Hauptproblem, das ich habe, ist, dass ich entweder meine aws Anmeldeinformationen in der Anwendung speichern oder ein anderes Schema verwenden muss.

Ich vermute, dass sie in der Anwendung speichern, ist nicht in Frage, wie sie leicht herausgesucht werden würde.

Eine andere Option besteht darin, einen Webdienst zu erstellen, der die aws-Authentifizierungssignatur erstellt, aber dies hat seine eigenen Probleme. Erfordert die Signatur alle Daten einer Datei, die hochgeladen wird? Wenn ja, müsste ich alle Daten zweimal übertragen. Es würde dann einen zentralen Fehlerpunkt geben, der einer der Hauptgründe für die Verwendung von aws war.

Irgendwelche Ideen?

UPDATE:

Ich brauchte es ein wenig klarer zu machen, dass ich bin zu wollen meine aws Anmeldeinformationen in einer Anwendung an andere übergeben speichern aus. DPAPI oder eine andere Verschlüsselung wäre nur Leute, die einfach Reflektor verwenden, um die Anmeldeinformationen zu erhalten. Die Verwendung einer Verschlüsselung erfordert immer noch den Schlüssel, der leicht zu bekommen ist.

UPDATE 2 - Sept 2011

Amazon haben einige Details veröffentlicht die AWS Security Token Service zur Verwendung, die ohne Offenlegung Ihrer geheimen Schlüssel für die Authentifizierung ermöglicht. Weitere Details finden Sie unter this blog post.

Antwort

10

Tim, du trifft in der Tat auf die beiden wichtigsten Ansätze:

  1. nicht gut genug: Bei der Lagerung der geheime Schlüssel „heimlich“ in der App. Es besteht in der Tat ein großes Risiko, dass jemand es einfach aus dem App-Code herausholt. Einige Maßnahmen können sein: (a) Verwenden Sie die DPAPI, um den Schlüssel außerhalb der App-Binärdatei zu speichern, oder (b) erhalten Sie den Schlüssel über die Verbindung von Ihrem Webdienst jedes Mal, wenn Sie ihn brauchen (über SSL), aber speichern Sie ihn niemals lokal.Kein Mitigation kann einen kompetenten Angreifer mit einem Debugger wirklich verlangsamen, da der Klartext-Schlüssel im RAM der App landen muss.

  2. BESSER: Übertragen Sie den Inhalt, der geschützt werden muss, an Ihren Webservice und unterschreiben Sie ihn dort. Die gute Nachricht ist, dass nur der Anforderungsname und der Zeitstempel signiert werden müssen - nicht alle hochgeladenen Bits (ich nehme an, dass Amazon die Zyklen nicht für die Überprüfung all dieser Bits ausgeben möchte!). Im Folgenden finden Sie die entsprechenden Codezeilen von Amazon "Introduction to AWS for C# Developers". Beachten Sie, wie Aws_GetSignature nur mit "PutObject" und einem Zeitstempel aufgerufen wird? Sie können die Signatur auf Ihrem eigenen Web-Service definitiv implementieren, ohne die gesamte Datei senden zu müssen und ohne Ihren Schlüssel zu kompromittieren. Wenn Sie sich wundern, Aws_GetSignature ist eine 9-Zeilen-Funktion, die einen SHA1-Hash auf einer Verkettung der Konstanten Zeichenfolge "AmazonS3", den Namen der Operation und die RFC822-Darstellung des Zeitstempels - mit Ihrem geheimen Schlüssel.

    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: beachten Sie, dass, während Sie den geheimen Schlüssel Teil Ihrer Amazon Identität verborgen halten können, der Zugriffsschlüssel-ID-Teil in der Anforderung eingebettet werden muss. Wenn Sie die Datei nicht über Ihren eigenen Webdienst senden, müssen Sie sie in die App einbetten.

+0

Das ist so ziemlich alles! Um ehrlich zu sein, wenn die Dateien ins Internet geladen werden, halte ich mich nicht viel mit einer Desktop-App. Nun, abgesehen von meinem Mangel an ASP-Wissen, und die Tatsache, es ist einfach, eine gut aussehende App in winforms/wpf – Tim

+0

Great! Ihre Frage gilt auch für Web-Apps, wenn sie die Datei nicht zweimal senden wollen (vom Browser zur Webapp, dann von der Webapp zu s3). Amazons Samples scheinen diese Überlegung manchmal zu überspringen. –

+0

Korrektur: Der zweite Parameter von 'PutObjectInline()' ist _der Schlüssel, der dem Objekt zugewiesen werden soll, und nicht 'cAWSSecretKey'. Siehe [AWS-Dokument] (http://docs.amazonwebservices.com/AmazonS3/latest/API/SOAPPutObjectInline.html). – amolbk

0

Das Hauptproblem, das ich habe, ist, dass ich entweder meine aws-Anmeldeinformationen in der Anwendung speichern oder ein anderes Schema verwenden muss.

Hat Windows einen systemweiten Dienst ähnlich wie Apples Keychain Manager? Wenn ja, legen Sie Ihre Anmeldeinformationen dort ab. Wenn nicht, können Sie möglicherweise eine verwässerte Version davon erstellen, um eine stark verschlüsselte Version Ihrer AWS-Anmeldeinformationen zu speichern.

Erfordert die Signatur alle Daten aus einer Datei, die hochgeladen wird?

Die HMAC SHA-1-Signatur ist eine verschlüsselte Verschlüsselung der HTTP-Request-Header. Diese Signatur ist ein Hash-Wert und wird im Vergleich zu Ihren nur 20 Byte langen Daten sehr kurz sein.

+0

Mein Punkt über die Signatur war, dass, wenn ich eine Datei senden würde, müsste ich alles an den Webdienst senden, nur um die Signatur zu generieren? – Tim

+0

Nein, Sie generieren die Signatur an Ihrem Ende. Sie generieren ihre eigene Signatur an ihrem Ende und vergleichen dann ihre Signatur mit der Ihren. Wenn die beiden Signaturen nicht übereinstimmen, schlägt die Anforderung fehl. Die Signaturen müssen übereinstimmen, um Ihre Anfrage zu authentifizieren und zu autorisieren. –

0

Sie können die Konfigurationsdatei verschlüsseln und/oder ProtectedData verwenden. Here's my blog post on both.

UPDATE: Sie könnten Ihre app.config als Teil eines Installationsschritts verschlüsseln. Probe hier: http://www.codeproject.com/KB/security/encryptstrings.aspx. Nicht großartig, aber das Beste, was ich bisher gefunden habe.

+0

DPAPI ist nur nützlich für den Schutz der Benutzerdaten, ich muss meine eigenen persönlichen Anmeldeinformationen speichern! – Tim

0

Lassen Sie jemanden, der eine Kopie Ihres Programms ergreift, auf die Daten in S3/SimpleDB zugreifen? Wenn nicht, benötigen Sie ein eigenes Authentifizierungsschema, das unabhängig von der AWS-Sicherheit ist. In diesem Fall können Sie einen Webdienst implementieren, der die Anmeldeinformationen akzeptiert, die Sie Ihren Kunden geben (ein Benutzername/Kennwort, z. B. ein digitales Zertifikat usw.), und führt dann die von Ihrem Programm benötigten S3/SimpleDB-Vorgänge aus. Auf diese Weise verlassen die AWS-Anmeldeinformationen niemals AWS. Wenn die Anmeldeinformationen eines bestimmten Benutzers kompromittiert sind, können Sie diese Anmeldeinformationen in Ihrem Webdienst abbrechen.

Verwandte Themen