Я использую Auth0 для обработки аутентификации в моем веб-приложении. Я использую ASP.NET Core v1.0.0 и Angular 2 RC5, и я не знаю много об аутентификации / безопасности в целом.
В документах Auth0 для ASP.NET Core Web Api есть два варианта алгоритма JWT: RS256 и HS256. Это может быть глупый вопрос, но:
В чем разница между RS256 и HS256? Какие есть варианты использования (если применимо)?
jwt
auth0
asp.net-core-webapi
Рико Калер
источник
источник
Ответы:
Оба варианта относятся к тому, какой алгоритм провайдер идентификации использует для подписи JWT. Подписание - это криптографическая операция, которая генерирует «подпись» (часть JWT), которую получатель токена может проверить, чтобы убедиться, что токен не был подделан.
RS256 (подпись RSA с SHA-256 ) является асимметричным алгоритмом и использует пару открытый / секретный ключ: у провайдера идентификации есть закрытый (секретный) ключ, используемый для генерации подписи, а потребитель JWT получает открытый ключ проверить подпись. Поскольку открытый ключ, в отличие от закрытого ключа, не нуждается в защите, большинство провайдеров идентификации делают его доступным для потребителей для получения и использования (обычно через URL-адрес метаданных).
HS256 ( HMAC с SHA-256), с другой стороны, включает в себя комбинацию функции хеширования и одного (секретного) ключа, который совместно используется двумя сторонами, используемыми для генерации хэша, который будет служить подписью. Поскольку один и тот же ключ используется как для генерации подписи, так и для ее проверки, необходимо позаботиться о том, чтобы ключ не был скомпрометирован.
Если вы будете разрабатывать приложение, использующее JWT, вы можете безопасно использовать HS256, потому что у вас будет контроль над тем, кто использует секретные ключи. Если, с другой стороны, у вас нет контроля над клиентом или у вас нет возможности защитить секретный ключ, RS256 подойдет лучше, поскольку потребителю нужно знать только открытый (общий) ключ.
Поскольку открытый ключ обычно делается доступным из конечных точек метаданных, клиенты могут быть запрограммированы на автоматическое получение открытого ключа. В этом случае (как и в случае с библиотеками .Net Core) у вас будет меньше работы по настройке (библиотеки будут получать открытый ключ с сервера). Симметричные ключи, с другой стороны, необходимо заменять вне полосы (что обеспечивает безопасный канал связи) и обновлять вручную, если происходит замена ключа подписи.
Auth0 предоставляет конечные точки метаданных для протоколов OIDC, SAML и WS-Fed, где можно получить открытые ключи. Вы можете увидеть эти конечные точки в разделе «Расширенные настройки» клиента.
Конечная точка метаданных OIDC, например, принимает форму
https://{account domain}/.well-known/openid-configuration
. Если вы перейдете по этому URL, вы увидите объект JSON со ссылкой наhttps://{account domain}/.well-known/jwks.json
, который содержит открытый ключ (или ключи) учетной записи.Если вы посмотрите на образцы RS256, то увидите, что вам не нужно никуда настраивать открытый ключ: он автоматически извлекается платформой.
источник
В криптографии используются два типа алгоритмов:
Симметричные алгоритмы
Один ключ используется для шифрования данных. При шифровании с помощью ключа данные могут быть расшифрованы с использованием того же ключа. Если, например, Мэри зашифрует сообщение с помощью ключа «мой секрет» и отправит его Джону, он сможет правильно расшифровать сообщение с помощью того же ключа «мой секрет».
Асимметричные алгоритмы
Два ключа используются для шифрования и дешифрования сообщений. В то время как один ключ (открытый) используется для шифрования сообщения, другой ключ (частный) может использоваться только для его расшифровки. Таким образом, Джон может генерировать как открытый, так и закрытый ключи, а затем отправлять только открытый ключ Мэри, чтобы зашифровать ее сообщение. Сообщение может быть расшифровано только с помощью закрытого ключа.
Сценарий HS256 и RS256
Эти алгоритмы НЕ используются для шифрования / дешифрования данных. Скорее они используются для проверки происхождения или подлинности данных. Когда Мэри нужно отправить открытое сообщение Джону, и он должен проверить, что сообщение обязательно от Мэри, можно использовать HS256 или RS256.
HS256 может создать подпись для данного образца данных, используя один ключ. Когда сообщение передается вместе с подписью, принимающая сторона может использовать тот же ключ для проверки того, что подпись соответствует сообщению.
RS256 использует пару ключей, чтобы сделать то же самое. Подпись может быть сгенерирована только с использованием закрытого ключа. И открытый ключ должен быть использован для проверки подписи. В этом случае, даже если Джек найдет открытый ключ, он не сможет создать поддельное сообщение с подписью, чтобы выдать себя за Мэри.
источник
Есть разница в производительности.
Проще говоря
HS256
, примерно на 1 порядок быстрее, чемRS256
для проверки, но примерно на 2 порядка быстрее, чемRS256
для выдачи (подписания).Не зацикливайтесь на реальных цифрах, просто думайте о них с уважением друг к другу.
[Program.cs]
источник
краткий ответ, специфичный для OAuth2,
источник