В основном уточняю, что здесь изложено .
Вот как это работает: допустим, у нас есть функция, которая принимает число от нуля до девяти, добавляет три и, если результат больше десяти, вычитает десять. Итак, f (2) = 5, f (8) = 1 и т. Д. Теперь мы можем создать другую функцию, назвав ее f ', которая идет в обратном направлении, добавив семь вместо трех. f '(5) = 2, f' (1) = 8 и т. д.
Это пример двусторонней функции и ее обратной. Теоретически, любые математические функции, которые отображают одну вещь в другую, могут быть обращены вспять. На практике, однако, вы можете сделать функцию, которая скремблирует входные данные настолько хорошо, что ее невероятно сложно развернуть.
Получение ввода и применение односторонней функции называется «хэшированием» ввода, и то, что Amazon хранит в своей системе, является «хэшем» вашего секретного ключа. SHA1 является примером такого рода односторонней функции, она также защищена от атак.
Функция HMAC основывается на установленных хеш-функциях и использует известный ключ для аутентификации текстовой строки. Это работает так:
- Вы берете текст вашего запроса и ваш секретный ключ и применяете функцию HMAC.
- Вы добавляете этот заголовок аутентификации в свой запрос и отправляете его в Amazon.
- Amazon ищет свою копию секретного ключа и только что отправленный текст и применяет функцию HMAC.
- Если результат совпадает, они знают, что у вас один и тот же секретный ключ.
Разница между этим и PKI заключается в том, что этот метод является RESTful , позволяя минимальное количество обменов между вашей системой и серверами Amazon.
Разве это не то же самое, что запрашивать у меня номера кредитных карт или пароль и сохранять их в собственной базе данных?
Да, хотя ущерб, который кто-то может нанести с помощью S3, кажется, ограничен истощением вашей учетной записи.
Насколько секрет они должны быть? Эти приложения как-то хранят секретные ключи?
В какой-то момент вам придется загрузить секретный ключ, и в большинстве систем на основе Unix, если злоумышленник может получить root-доступ, он может получить ключ. Если вы шифруете ключ, у вас должен быть код для его расшифровки, и в какой-то момент код дешифрования должен быть простым текстом, чтобы его можно было выполнить. Это та же проблема, что и DRM, за исключением того, что у вас есть компьютер.
Во многих случаях я просто помещаю секретные ключи в файл с ограниченными разрешениями и принимаю обычные меры предосторожности, чтобы предотвратить рутирование моей системы. Есть несколько хитростей, чтобы заставить его работать должным образом с многопользовательской системой, например, избегать временных файлов и тому подобное.