Один из членов команды в нашем офисе обеспечил следующее руководство на том, когда использовать константу, статичную, и только для чтения:
Одно заключительное примечание: поле константы статично, но инверсия не верна.
Тим, вы действительно используете два ключевых подхода:
НЕ ДОСТАТОЧНО: храните секретный ключ «тайно» в приложении. Действительно, существует серьезный риск того, что кто-то просто выберет его из кода приложения. Некоторыми смягчениями могут быть (а) использование DPAPI для хранения ключа вне двоичного файла приложения или (б) получение ключа по сети от вашего веб-сервиса каждый раз, когда он вам нужен (через SSL), но никогда не храните его локально. Никакие меры не могут действительно замедлить компетентного злоумышленника с помощью отладчика, так как ключ открытого текста должен оказаться в ОЗУ приложения.
ЛУЧШЕ: отправьте контент, который необходимо защитить, в вашу веб-службу и подпишите его там. Хорошая новость заключается в том, что необходимо подписать только имя запроса и метку времени, а не все загруженные биты (я думаю, 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, часть идентификатора ключа доступа должна быть встроена в запрос. Если вы не отправите файл через собственный веб-сервис, вам придется встроить его в приложение.
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.
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.
Вы позволите любому, у кого есть копия вашей программы, получить доступ к данным на S3 / SimpleDB? В противном случае вам понадобится собственная схема аутентификации, не зависящая от безопасности AWS.
В этом случае вы можете реализовать веб-сервис, который принимает учетные данные, которые вы даете своим клиентам (имя пользователя / пароль, например, цифровой сертификат, и т.д.), а затем выполняет операции S3 / SimpleDB, которые требуются вашей программе. Таким образом, учетные данные AWS никогда не покидают AWS. Если учетные данные конкретного пользователя скомпрометированы, вы можете отменить эти учетные данные в своем веб-сервисе.