Сохранение учетных данных Amazon в приложении С# Desktop

Я рассматриваю использование Amazon S3 и simpleDB в настольном приложении.

Основная проблема заключается в том, что мне нужно либо сохранить свои учетные данные aws в приложении, либо использовать какую-либо другую схему.

Я предполагаю, что их хранение в приложении не может быть и речи, поскольку их можно было бы легко выбрать.

Другой вариант - создать веб-службу, которая создает подпись аутентификации aws, но у нее есть свои проблемы. Подписывает ли подпись все данные из загружаемого файла? Если это так, мне придется переводить все данные дважды. Тогда была бы центральная точка отказа, которая была одной из основных причин использования aws.

Любые идеи?

UPDATE:

Мне нужно было сделать немного яснее, что я хочу хранить свои учетные данные в приложении, переданном другим. DPAPI или любое другое шифрование будут только останавливать людей, просто используя рефлектор, чтобы получить учетные данные. Использование любого шифрования по-прежнему требует ключа, который легко получить.

ОБНОВЛЕНИЕ 2 - Сентябрь 2011

Amazon опубликовала некоторые сведения об использовании службы токенов AWS, которая позволяет аутентифицировать, не раскрывая секретный ключ. Более подробная информация доступна на этом сообщении в блоге.

Ответы

Ответ 1

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

  • НЕ ХОРОШАЯ ДОСТАТОЧНОСТЬ: храните секретный ключ "втайне" в приложении. Существует действительно серьезный риск того, что кто-то просто выберет его из кода приложения. Некоторые меры по смягчению могут заключаться в том, чтобы (a) использовать DPAPI для хранения ключа вне бинарного файла приложения или (b) получать ключ через провод от вашего веб-сервиса каждый раз, когда вам это нужно (через SSL), но никогда не хранить его локально. Никакое смягчение не может действительно замедлить компетентного злоумышленника с помощью отладчика, так как ключ cleartext должен оказаться в ОЗУ приложения.

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

    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 );
    

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

Ответ 2

Основная проблема заключается в том, что мне нужно либо сохранить свои учетные данные aws в приложении, либо использовать другую схему.

Имеет ли Windows общесистемную услугу, похожую на Apple Keychain Manager? Если да, поставьте свои учетные данные. Если нет, возможно, вы можете создать из него смоленную версию для хранения сильно зашифрованной версии ваших учетных данных AWS.

Требуется ли для подписи все данные из загружаемого файла?

Подпись HMAC SHA-1 представляет собой кодированное шифрование заголовков HTTP-запросов. Эта подпись является хэш-значением и будет очень коротка относительно ваших данных, длиной всего 20 байтов.

Ответ 3

Вы можете зашифровать файл конфигурации и/или использовать ProtectedData. Здесь мое сообщение в блоге обоим.

ОБНОВЛЕНИЕ. Возможно, вы можете зашифровать ваш app.config как часть этапа установки. Пример здесь: http://www.codeproject.com/KB/security/encryptstrings.aspx. Не очень, но лучшее, что я нашел до сих пор.

Ответ 4

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

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