Рейтинг:2

Получение ключа подписи AWS v4

флаг ht

Генерация заголовка авторизации с подписью AWS v4 включает получение ключа подписи следующим образом:

https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html

статический байт [] HmacSHA256 (строковые данные, ключ байта []) выдает исключение {
    Строковый алгоритм="HmacSHA256";
    Mac mac = Mac.getInstance(алгоритм);
    mac.init (новый SecretKeySpec (ключ, алгоритм));
    вернуть mac.doFinal(data.getBytes("UTF-8"));
}

статический байт [] getSignatureKey (ключ String, String dateStamp, String regionName, String serviceName) выдает Exception {
    byte[] kSecret = ("AWS4" + ключ).getBytes("UTF-8");
    byte[] kDate = HmacSHA256(dateStamp, kSecret);
    byte[] kRegion = HmacSHA256(regionName, kDate);
    byte[] kService = HmacSHA256(serviceName, kRegion);
    byte[] kSigning = HmacSHA256("aws4_request", kService);
    вернуть kSigning;
}
  1. В чем преимущество вычисления HMAC, как показано выше, в несколько последовательных шагов, вместо выполнения только одного вычисления HmacSHA256 для объединенных входных данных (dateStamp, regionName и serviceName)?
  2. В чем преимущество вышеописанного подхода по сравнению с использованием стандартного HKDF?
Рейтинг:3
флаг cn

Ступенчатая схема позволяет выполнять каждый шаг отдельному объекту.

  1. Центральный сервер хранит мастер-ключ и никому его не передает. Этот центральный сервер должен иметь высокую доступность и высокий уровень безопасности, но может иметь низкую пропускную способность. Ключ можно хранить в аппаратный модуль безопасности.
  2. На первом этапе ключ однозначно объединяется с номером версии протокола ("AWS4" + ключ). Это позволяет при обновлении протокола использовать тот же ключ, поэтому вам не нужно распространять новые ключи одновременно с обновлением протокола.
  3. Второй шаг объединяет ключ с датой (HMAC(даташтамп, "AWS4" + ключ); в протокол определяет штамп даты с разрешением 1 день). Ключ меняется каждый день. Более быстрые изменения требуют большей пропускной способности центрального сервера, тогда как более медленные изменения означают большее влияние в случае компрометации чего-либо ниже по цепочке.
  4. Каждый день сервер каждого региона запрашивает ключ региона дня. kRegion = HMAC(regionName, HMAC(dateStamp, "AWS4" + ключ)). Центральный сервер может аутентифицировать сервер региона, чтобы гарантировать, что только сервер данного региона может получить ключ региона.
  5. Каждая служба, использующая ключ, запрашивает свой собственный ключ. kService = HMAC(kRegion, serviceName) из региона, где он работает. Региональный сервер может аутентифицировать службу, чтобы гарантировать, что служба не узнает ключ другой службы.
  6. Сервис сочетает в себе ключ с целью: kSigning = HMAC(kService, "aws4_request"). Это позволяет при необходимости использовать один и тот же мастер-ключ для разных целей.

Преимущество такого распределения в том, что каждый участник имеет доступ только к своим ключам. Невозможно найти выданный мастер-ключ kРегион, или найти указанный ключ региона kService, или найти указанный служебный ключ kПодписание. Это сводит к минимуму влияние компрометации: затрагиваются только участники ниже по цепочке. Например, если нарушение обнаружено в американском центре обработки данных 05 января 2022 г., а журналы показывают, что нарушение произошло 01 января 2022 г., то подозрительными могут быть только подписи, сделанные после 01 января 2022 г. в американском регионе. нужно отозвать. Подписи, сделанные в Европе или до 01.01.2022, по-прежнему хороши.

Конечно, только крупные развертывания когда-либо будут использовать эту гибкость. В большинстве приложений весь расчет выполняется в одной и той же программе в рамках одной функции. Но протокол действительно масштабируется для крупных развертываний, в которых используется разделение для смягчения последствий нарушений.

Объединение входов сразу:

флаг us
@automatictester Действительно, это было объяснено в одном из основных докладов этого года re:Invent. Основная цель — делегировать аутентификацию отдельным регионам/службам. Каждая служба будет получать производный ключ для пользователя после того, как он будет действителен в течение дня, поэтому сама служба не получит доступа к секретному ключу, но при этом службе не нужно будет связываться с центральным IAM для каждого запроса на аутентификацию.
Рейтинг:1
флаг us

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

Вы можете пойти дальше и сделать это с помощью обычного PRF, но тогда вы столкнетесь с проблемой: а именно, вы не хотите иметь ситуацию, когда неверные значения любой из записей кортежа внезапно приводят к конфликтам ключей. Классическая ошибка, например. использовать прямую конкатенацию, и если они не будут осторожны, вы получите (сегодня) и (сегодня) дает один и тот же ключ. Очевидно, что задействованные здесь струны более структурированы, чем в примере, но основная проблема должна быть ясна.

Теперь самый эффективный способ решить указанную выше проблему — использовать функцию сопряжения, которая гарантии что никакие два различных входных кортежа не дают одинаковых выходных данных и, следовательно, одинаковых входных данных для PRF. Однако разработка таких функций также немного подвержена ошибкам.

я предполагать именно из-за этого AWS решила использовать эту запутанную цепочку вызовов HMAC. Теперь им не нужно беспокоиться о сложных функциях сопряжения, и все, что требуется, — это набор оценок HMAC, которые должны быть возможны практически во всех языках/средах. Тот факт, что для этого требуется не менее операций HMAC, компенсируется тем фактом, что все входные данные для получения этого ключа являются в некотором роде static, и вы можете кэшировать ключи примерно на день, если операции HMAC требуют для вас значительного вычислительного времени.

automatictester avatar
флаг ht
Разве однократное вычисление HMAC по структурированной строке типа `[dateStamp=...;regionName=...;serviceName=...]` не является более простым решением этой проблемы?
флаг us
@automatictester это просто еще одно решение, дизайнерское решение. Когда «структурированный» ввод может содержать любой ввод клиента (ключ s3, идентификатор строки базы данных,.), тогда я бы предпочел использовать вложенный хеш, чем рисковать любым потенциальным конфликтом.
Gilles 'SO- stop being evil' avatar
флаг cn
@automatictester Почему вы думаете, что это будет проще? Сравните количество строк кода для двух решений и обратите внимание, что если структурированную строку легко создать, это означает, что вы добавляете большую библиотеку форматирования данных в качестве зависимости.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.