Хранение моих учетных данных Amazon в настольном приложении C#

Один из членов команды в нашем офисе обеспечил следующее руководство на том, когда использовать константу, статичную, и только для чтения:

  • Использование константа , когда у Вас есть переменная типа, можно знать во времени выполнения (строковый литерал, интервал, дважды, перечисления...), что Вы хотите, чтобы все экземпляры или потребители класса имели доступ туда, где значение не должно изменяться.
  • Использование статичный , когда у Вас есть данные, что Вы хотите, чтобы все экземпляры или потребители класса имели доступ туда, где значение может измениться.
  • Использование статичный только для чтения , когда у Вас есть переменная типа, который Вы не можете знать во времени выполнения (объекты), что Вы хотите, чтобы все экземпляры или потребители класса имели доступ туда, где значение не должно изменяться.
  • Использование только для чтения , когда у Вас есть переменная уровня экземпляра, Вы будете знать во время создания объекта, которое не должно изменяться.

Одно заключительное примечание: поле константы статично, но инверсия не верна.

14
задан Tim 14 September 2011 в 15:29
поделиться

4 ответа

Тим, вы действительно используете два ключевых подхода:

  1. НЕ ДОСТАТОЧНО: храните секретный ключ «тайно» в приложении. Действительно, существует серьезный риск того, что кто-то просто выберет его из кода приложения. Некоторыми смягчениями могут быть (а) использование DPAPI для хранения ключа вне двоичного файла приложения или (б) получение ключа по сети от вашего веб-сервиса каждый раз, когда он вам нужен (через SSL), но никогда не храните его локально. Никакие меры не могут действительно замедлить компетентного злоумышленника с помощью отладчика, так как ключ открытого текста должен оказаться в ОЗУ приложения.

  2. ЛУЧШЕ: отправьте контент, который необходимо защитить, в вашу веб-службу и подпишите его там. Хорошая новость заключается в том, что необходимо подписать только имя запроса и метку времени, а не все загруженные биты (я думаю, Amazon не Я тоже не хочу тратить циклы на проверку всех этих бит!). Ниже приведены соответствующие строки кода из собственной статьи Amazon « Введение в AWS для разработчиков C # ». Обратите внимание, как Aws_GetSignature вызывается только с «PutObject» и временной меткой? Вы определенно можете реализовать подпись в своем собственном веб-сервисе, не отправляя весь файл и не подвергая риску свой ключ. Если вам интересно, Aws_GetSignature - это 9-строчная функция, которая выполняет хэш SHA1 на конкатенации постоянной строки «AmazonS3», имени операции и представления временной метки RFC822 - с использованием ваш секретный ключ.

     DateTime timestamp = Aws_GetDatestamp (); и отметка времени? Вы определенно можете реализовать подпись в своем собственном веб-сервисе, не отправляя весь файл и не подвергая риску свой ключ. Если вам интересно,  Aws_GetSignature  - это 9-строчная функция, которая выполняет хэш SHA1 на конкатенации постоянной строки «AmazonS3», имени операции и представления временной метки RFC822 - с использованием ваш секретный ключ. 

     DateTime timestamp = Aws_GetDatestamp (); и отметка времени? Вы определенно можете реализовать подпись в своем собственном веб-сервисе, не отправляя весь файл и не подвергая риску свой ключ. Если вам интересно,  Aws_GetSignature  - это 9-строчная функция, которая выполняет хэш SHA1 на конкатенации постоянной строки «AmazonS3», имени операции и представления временной метки RFC822 - с использованием ваш секретный ключ. 

     DateTime timestamp = Aws_GetDatestamp ();
    строковая подпись = Aws_GetSignature ("PutObject", отметка времени);
    byte [] data = UnicodeEncoding.ASCII.GetBytes (контент);
    service.PutObjectInline ("MainBucket", cAWSSecretKey, метаданные,
     data, content.Length, null,
     StorageClass.STANDARD, правда,
     cAWSAccessKeyId, отметка времени, истина,
     подпись, null);
    

РЕДАКТИРОВАТЬ: обратите внимание, что, хотя вы можете скрыть часть секретного ключа вашей личности Amazon, часть идентификатора ключа доступа должна быть встроена в запрос. Если вы не отправите файл через собственный веб-сервис, вам придется встроить его в приложение.

10
ответ дан 1 December 2019 в 15:12
поделиться

You can encrypt the config file and/or use ProtectedData. Here's my blog post on both.

UPDATE: You might be a be to encrypt your app.config as part of an install step. Sample here: http://www.codeproject.com/KB/security/encryptstrings.aspx. Not great, but the best I've found so far.

0
ответ дан 1 December 2019 в 15:12
поделиться

The main issue I have is that I either need to store my aws credentials in the application or use some other scheme.

Does Windows have a system-wide service similar to Apple's Keychain Manager? If so, put your credentials there. If not, perhaps you can build a watered-down version of it for storing a strongly-encrypted version of your AWS credentials.

Does the signature require all the data from a file thats being uploaded?

The HMAC SHA-1 signature is an encoded encryption of the HTTP request headers. This signature is a hash value and will be very short relative to your data, only 20 bytes long.

0
ответ дан 1 December 2019 в 15:12
поделиться

Вы позволите любому, у кого есть копия вашей программы, получить доступ к данным на S3 / SimpleDB? В противном случае вам понадобится собственная схема аутентификации, не зависящая от безопасности AWS.

В этом случае вы можете реализовать веб-сервис, который принимает учетные данные, которые вы даете своим клиентам (имя пользователя / пароль, например, цифровой сертификат, и т.д.), а затем выполняет операции S3 / SimpleDB, которые требуются вашей программе. Таким образом, учетные данные AWS никогда не покидают AWS. Если учетные данные конкретного пользователя скомпрометированы, вы можете отменить эти учетные данные в своем веб-сервисе.

0
ответ дан 1 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: