Хэш ключа не совпадает ни с одним из сохраненных ключей в стандофф 2

Обновлено: 07.07.2024

keytool-exportcert-псевдоним diego -keystore "C:\Users\Diego\Desktop\CeluChat.KeyStore" | "C:\openssl\bin\openssl.exe" sha1-двоичный файл | "C:\openssl\bin\openssl.exe" base64

CeluChat.KeyStore-это хранилище ключей, которое я использовал при экспорте подписанного приложения, и когда keytool предлагает мне ввести пароль, я ввел его же при экспорте.

Но ошибку, которая дает мне на производство (скачал из Play Маркет) - это:

Ключ Hash, который находится в исключении, отличается от ключа hash, сгенерированного с помощью keytool. Во всяком случае, я добавил ключ Hash на Facebook, но он все еще не работает.

Я создаю приложение Android, которое будет интегрироваться с Facebook. Мне удалось успешно сгенерировать ключ Hash, и когда я запустил свое приложение для входа в систему, я успешно добрался до кнопки Принять разрешения. Я нажал кнопку Принять и с тех пор не могу снова войти в систему из.

Facebook кое - как заменяет+, - и / с _

Поэтому просто попробуйте заменить _ на +, - и / и добавьте этот hash-ключ.

Надеюсь, это сработает.

Я использовал это, чтобы показать ключ, когда запускал свое приложение. В моем случае я получал неверный ключ hash из команды keytool. Обратите внимание, что если вы вводите неправильный пароль(намеренно), вместо получения ошибки генерируется неправильный ключ. Используйте это, чтобы получить правильный hash и посмотреть, совпадает ли он с тем, который указан в журнале ошибок

Также, если по какой-то причине вышеуказанный метод не работает. Попробуйте использовать этот APK, чтобы сгенерировать правильный ключ hash. Помните, что вы должны подписать его с любым сертификатом, который вы пытаетесь получить(отладка или выпуск). Установите его на свое тестовое устройство и запустите.

Я сохранил ключ, включающий символ trailing =. Это сработало.

VQ3XhZb5_tBH9oGe2WW32DDdNS0

На Facebook ключевых хэшах разработчиков вашего приложения.

Надеюсь, это поможет.

Я пытаюсь использовать Facebook Android SDK для разработки простого приложения с кнопкой входа Facebook. Но у меня возникли проблемы с ключевыми хэшами. Я создал как ключ отладки, так и ключ выпуска: Отладочный ключ: keytool -exportcert -alias androiddebugkey -keystore

Ну, если u r использует Windows, используйте эту команду в cmd .

Переместить в C:\Program Files\Java\jdk1.8.0_25\bin

keytool -exportcert -alias androiddebugkey -keystore

/.android/debug.keystore | "C:\openssl\bin\openssl.exe" sha1 -binary | "C:\openssl\bin\openssl.exe" base64

При создании ключа hash вам нужно использовать openssl-0.9.8e_X64.zip на windows, вы не можете использовать openssl-0.9.8k_X64.zip

Это и есть решение.

Это хороший вопрос. И есть 2 способа сделать это. Что обычно происходит с нами, так это то, что при интеграции Facebook SDK для android мы продолжаем следовать инструкциям с сайта разработчика facebook .

Но как только приложение выходит в play-store, мы, как правило, забываем о процедуре, которая еще не завершена. И мы заканчиваем на той же ошибке :

Просто у меня есть контрольный список для этого:

1) Использование ключа отладки при разработке приложения

Сайт разработчика Facebook весьма полезен в этом отношении. Просто скопируйте и вставьте код, который у них есть на странице "Начало работы", в командную строку. именно:

Пароль к нему-android, и после него вы получите ключ отладки.

enter image description here

2) Генерация ключа отладки после подписания приложения

Как только приложение будет готово к загрузке в магазин Google Play, нам нужно подписать его с помощью ключа, значение которого генерируется из хранилища ключей. Что хорошо объясняется Сатишем в его ответе . :

Что дает вам другой ключ, чем ключ отладки.

enter image description here

Попробовав все вышесказанное, я попробовал это . и сработало.

На 100 Процентов Это Точно Сработает.

ну, на самом деле лучший и простой способ-это вот так. если вы видите эту проблему на экране своего телефона. Вы должны увидеть эту проблему с android studio LOGCAT.

скопируйте этот ключ hash из logcat, который я сделал закрытым (. ), и вставьте его на свою страницу разработчика facebook. Это немедленно решит вашу проблему. Также убедитесь, что ваш выпущенный ключ APK hash отличается от оригинального ключа hash, который можно загрузить из Google Play.

Похожие вопросы:

Я пишу заявление на android вместе со своим другом. В приложении мы используем Facebook SDK и кнопку входа в систему. Мы уже настроили ключ hash, используя код, аналогичный тому, что предлагает код.

Я столкнулся с очень странной проблемой с хэшами ключей Facebook. Facebook SDK используется в моем приложении Android для обеспечения собственной аутентификации. Все работало просто отлично, до.

Я пытаюсь реализовать facebook login в своем приложении, которое я опубликую в playstore. Для этого нам нужно сгенерировать ключ разблокировки hash. Я попытался создать его, следуя руководству в.

Я создаю приложение Android, которое будет интегрироваться с Facebook. Мне удалось успешно сгенерировать ключ Hash, и когда я запустил свое приложение для входа в систему, я успешно добрался до.

Я пытаюсь использовать Facebook Android SDK для разработки простого приложения с кнопкой входа Facebook. Но у меня возникли проблемы с ключевыми хэшами. Я создал как ключ отладки, так и ключ.

Я получаю ошибку при попытке войти в Facebook в моем приложении: Неверный ключ hash. Ключ hash (ключ hash, отображаемый здесь) не соответствует ни одному сохраненному хэшированному ключу. Настройте.

Во-первых, процитируем Стива Джобса: Меня огорчает не успех Microsoft - у меня нет проблем с их успехом. (. ) у меня есть проблема с тем, что они просто делайте действительно третьесортные.

keytool -exportcert -alias diego -keystore "C: \ Users \ Diego \ Desktop \ CeluChat.KeyStore" | "C: \ openssl \ bin \ openssl.exe" sha1 -binary | "C: \ openssl \ bin \ openssl.exe" base64

CeluChat.KeyStore - это хранилище ключей, которое я использовал при экспорте подписанного приложения, и когда keytool предлагает мне ввести пароль, я ввел его при экспорте.

Но ошибка, которая выдает мне при производстве (загружена из Play Store):

Key Hash, который находится в исключении, отличается от ключевого хэша, созданного с помощью keytool. В любом случае я добавил Key Hash на Facebook, но он все еще не работает.

Facebook каким-то образом заменяет +, - и / на _

Так что просто попробуйте заменить _ на +, - и / и добавить этот хеш-ключ.

Надеюсь, это сработает.

Также, если по какой-то причине вышеуказанный способ не работает. Попробуйте использовать этот APK, чтобы сгенерировать правильный хэш ключа. Помните, что вы должны подписать его любым сертификатом, который вы пытаетесь получить (отладить или выпустить). Установите его на свое тестовое устройство и запустите.

Я сохранил ключ, включая завершающий символ =. Это сработало.

VQ3XhZb5_tBH9oGe2WW32DDdNS0

На Facebook разработчики ключевые хэши вашего приложения.

Надеюсь на эту помощь.

Что ж, если вы используете Windows, используйте эту команду в cmd.

Перейдите в C: \ Program Files \ Java \ jdk1.8.0_25 \ bin

keytool -exportcert -alias androiddebugkey -keystore

/.android/debug.keystore | "C:\openssl\bin\openssl.exe" sha1 -binary | "C:\openssl\bin\openssl.exe" base64

При генерации хеш-ключа вам необходимо использовать openssl-0.9.8e_X64.zip в Windows, вы не можете использовать openssl-0.9.8k_X64.zip

Хороший вопрос. И есть 2 способа сделать это. Обычно при интеграции Facebook SDK для Android мы следуем инструкциям Сайт разработчика facebook.

Но как только приложение появляется в игровом магазине, мы забываем о процедуре, которая еще не завершена. И мы заканчиваем той же ошибкой:

У Юса есть контрольный список для этого:

1) Использование ключа отладки при разработке приложения

Сайт разработчика Facebook очень помогает в этом. Просто скопируйте и вставьте код, который у них есть на странице «Начало работы», в свою команду. Подсказка. а именно:

Пароль к нему - android, и после него вы получите ключ отладки.

enter image description here

2) Создание ключа отладки после подписания приложения

Когда приложение будет готово к загрузке в магазин Google Play, нам нужно подписать его с помощью ключа, значение которого генерируется из хранилища ключей. Это хорошо объясняется Сатишем в своем ответе. с использованием :

Это дает вам другой ключ, чем ключ отладки.

enter image description here

Попробовав все вышеперечисленное, я попробовал это .. и сработало .

  1. Копирование ключевого хеша было таким же, что и Facebook для исключения,
  2. Замените "_" на "/" и добавьте " info">

100 процентов будет работать точно.

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

Скопируйте этот хэш-ключ из logcat, который я сделал закрытым (. ), и вставьте его на свою страницу разработчика facebook. Это сразу решит вашу проблему. Также убедитесь, что хэш-ключ выпущенного APK отличается от исходного хеш-ключа, который загружен из Google Play.

Для выпущенной версии сгенерируйте хэш-ключ, используя эту строку:

Если у вас есть приложение в магазине приложений Google, просто перейдите в => => и скопируйте свой ключ SHA-1. Затем перейдите на этот веб-сайт и скопируйте свой ключ SHA-1 на верхней текстовой панели ссылку

Скопируйте хэш ключа (выходной base64) в поле хэша ключа facebook. теперь все должно работать. : D

Anonim

Blockchain Class2 | Как работает BlockchainI బ్లాక్ చైన్ క్లాస్ 2 తెలుగులో JAN02 | VLR Training9985269518

У меня действительно проблемы с хеш-ключом Facebook. Я создал это в моем Eclipse .. доказательство:




И, наконец, я установил свой хэш-ключ в настройках разработчиков Facebook:


Кто-нибудь знает, что я сделал не так или как я могу решить эту проблему? Если я использовал идентификатор и имя из HelloFacebookSample внутри моего собственного приложения, все работает. Так что это ДОЛЖНО быть связано с ключевым хешем, идентификатором или именем, которое я где-то установил, скорее всего .

2) Запишите этот хэш-ключ.

3) Поместите его в консоль разработчика facebook, где вы сначала сгенерировали свой ключ api, и удалите хэш-ключ с помощью new и сохраните. Теперь все готово. Любой, кто загружает ваше приложение, опубликованное с использованием ранее использованного хранилища ключей, может войти в facebook.

  • Благодарю. Работал как шарм.
  • Нет, у меня не сработало. Он по-прежнему отлично работает без приложения facebook, но если приложение fb установлено, оно дает мне ту же ошибку
  • Большое спасибо, дружище!
  • Хэш ключа выпуска не работает для меня, но хеш ключа отладки работал нормально
  • Не могли бы вы рассказать мне о концепции хеширования клавиш, что это такое на самом деле и по каким критериям они генерируются?

После нескольких часов попыток я наконец нашел решение.

Я столкнулся с похожей проблемой. Решение на удивление простое.

  • 2 Это лучший ответ.
  • Это идеальный ответ
  • и, когда вас попросят ввести пароль ключа отладки, который вы никогда не устанавливали, введите android и спасибо позже :)
  • 4 исключение больше не возвращает хэш ключа
  • даже это не сработало для меня, я удалил приложение facebook, и оно сработало, как указано в другом ответе

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

1- команда facebook, предоставляемая для получения хеш-ключа с помощью команды openSSL, не дала мне правильный хеш, который я получил, извлекая подпись из информации о пакете с кодом. получение хеша вторым способом было правильным.


ну вот и все .. и для записей я использовал openssl-0.9.8k_X64 в Windows 7 x64 бит, и он просто генерирует неправильный хеш, я не знаю почему

Я использовал этот код, чтобы получить хеш:

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

Это случай, который мог произойти и решил мою ошибку:

OSX / Linux:

Windows:

когда Enter keystore password: спрашивают возможно, вы случайно ввели неправильный пароль, пароль по умолчанию - android. Ввод любого другого пароля даст вам другой / неправильный хэш-ключ. Вставьте правильный хеш-ключ в Key Hashes поле на странице вашего приложения

Это решило мою проблему, надеюсь, это поможет тому, кто сделал именно эту ошибку, которую я сделал.

  • Можно ли изменить пароль по умолчанию? если да как \ где?
  • @ Coder123 просто создай свой debugAlt.jks в другом каталоге с другим паролем и ключом и поместите его в свой signingConfigs < debug < storeFile file(new File('../debugKey.jks')) storePassword 'Qwerty123' keyAlias 'debug' keyPassword 'Qwerty123' >>
  • Вы имеете в виду, что мы должны обязательно использовать "android" в качестве пароля? где это написано?
  • @ user1090751 нажмите ссылку "android" в моем ответе, чтобы получить более подробную информацию. Вы можете создать свой собственный пароль, как указано в предыдущем комментарии.
  • Спасибо за этот пароль! Это решило проблему для меня!

ДАТА ОБНОВЛЯЕТСЯ КАЖДЫЙ РАЗ Я ГОЛОСОВАЛСЯ, ПОТОМУ ЧТО Я ЗНАЮ, ЧТО ЕЩЕ ДЕЙСТВИТЕЛЬНО

ДАТА: 01.06.2021 (6 января 2021 г.)

Вот как я решил эту проблему

(находится в gradle -> tasks / android / signedReport)

Скопируйте значение SHA1 в буфер обмена

как это XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX

чтобы преобразовать значение SHA1 в base64.

Это то, что требует Facebook, чтобы получить сгенерированный хеш "******************** ="

выберите свой проект на вкладке настроек, basic / Key Hashes добавьте сгенерированный ключ.

не забудьте сохранить изменения.

  • 1 После 18 часов работы над этой проблемой . это помогло.
  • Пожалуйста, чтобы это помогло тебе

Добавление ключей SHA1 из Eclipse / keytool помогло мне только при создании приложения на FB, тогда после перестройки я всегда получал ошибку OP.

--- 2019 ----- Вот как я решил эту проблему

  • Спасибо, это решило мою проблему. Почему не работает версия keytool - это интересно

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

  1. Откройте свой проект в студии Android и запустите проект.
  2. Щелкните меню Gradle.
  3. Выберите свое приложение и разверните дерево задач.
  4. Дважды щелкните android -> signedReport и посмотрите на волшебство



  • 1 Хорошее простое решение, просто убедитесь, что вы скопировали sha1 из правильного варианта, в моем случае это был релиз.

При создании ключа выпуска релиза обратите внимание на это

Для Windows

При генерации хеш-ключа для производства вам необходимо использовать openssl-0.9.8e_X64.zip в Windows, вы не можете использовать openssl-0.9.8k_X64.zip

В версиях выдаются разные хеш-ключи, почему-то не работает 9.8k . 9.8e работает.

Используйте этот ниже поток

Вот как я решил эту проблему. Загрузите ваш APK на свой компьютер в папке java jdk \ bin, в моем случае C: \ Program Files \ Java \ jdk1.7.0_121 \ bin перейдите в папку java jdk \ bin и запустите cmd, затем скопируйте следующее команда в вашем cmd

Для MAC

Создайте ключ SHA1 с помощью команды ниже
keytool -list -v -keystore Путь к хранилищу ключей
Введите пароль хранилища ключей.
Скопируйте ключ SHA1.

  • 1 это решило мою проблему keytool -list -printcert -jarfile yourapkname.apk :)
  1. Проверьте значение хэша ключа.
  2. Удалите приложение Facebook со своего телефона.
  3. Затем попробуйте еще раз с помощью SDK.

Это решило мою проблему.

  • 2 Удаление приложения FB решило проблему !! Спасибо :)
  • @Rezaul Karim, он работает, но что, если я хочу, чтобы он работал без установки приложения fb?

У меня эта проблема уже два месяца. Мои ключевые хэши накапливались до 9. Сегодня я наконец нашел простое решение:

ШАГ 1:

Установите facebook sdk, который вы загрузили со страницы разработчика facebook на свой телефон. Не устанавливайте обычное приложение facebook. Убедитесь, что вы можете войти в facebook. Затем выйдите из системы.

ШАГ 2:

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

ШАГ 3:

Поместите файл Apk на свой телефон через USB-кабель или USB-накопитель.

ШАГ 4:

ШАГ 5:

ШАГ 6:

ШАГ 7:

Поместите его в консоль разработчика facebook и сохраните. Теперь все готово. Любой, кто загружает ваше приложение, опубликованное с использованием ранее использованного хранилища ключей, может войти в facebook.

  • Я следую вашим советам, вставил этот facebook-universalalsignin.apk в мобильный телефон и установил это. а затем мое приложение было установлено и запущено в этой ситуации, также всплывающее окно facebook открылось для входа в систему, другое диалоговое окно не появится, пожалуйста, помогите мне
  • Вы установили facebook sdk со страницы разработчика и удалили обычное приложение facebook из игрового магазина?

Это выглядит безумно, но работает

На самом деле проблема из-за того, что у вас есть личная учетная запись facebook, и хеш-ключ этой учетной записи не сопоставим

Но вы не должны сталкиваться с этой ошибкой с реальным пользователем. Но я не уверен

В конце концов выполните следующий шаг:



А затем нажмите крестик


И теперь вы можете войти в систему через facebook. Но в следующий раз, если вы выйдете из системы и попытаетесь войти снова, вы столкнетесь с той же проблемой .

Но я не верю, что facebook не знает об этом .

Это сработало для меня


Я обнаружил, что мой SHA-1, который использовался для подписи приложения для загрузки в Google Playstore, был неправильным. Я понял, что мое приложение подписывается в магазине Google Play с другим токеном. Я выполнил следующие шаги:

  1. Перейти в консоль Google Play
  2. Нажмите Release Management.
  3. Нажмите "Подписание приложения"
  4. Преобразование сертификата подписи приложения SHA-1 в Base64 (он будет отличаться от вашего текущего сертификата загрузки)

Введите преобразованный в Base64 SHA-1 в настройки моей панели управления Facebook Developer.

Теперь я могу войти в свое приложение, когда Facebook загружен на Android-устройство.

Создание хранилища ключей с помощью команды keytool (keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -sigalg SHA1withRSA -keysize 2048 -validity 10000) и размещение этого хранилища ключей в самой верхней родительской папке моих проектов и создание следующая запись в файле build.gradle проекта решила проблему:

  • Функция showHashKey работает как шарм при получении ключа, tnx

У меня та же проблема. Я обнаружил, что использовал неправильный хэш-ключ. keytool напечатал неправильный хэш-ключ, потому что я запустил команду с неправильным псевдонимом.
Пожалуйста, проверьте свою команду еще раз, это решит вашу проблему.

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

Не работает: на устройстве установлено приложение Facebook.

Работает: приложение Facebook не установлено

Итак, следующий код решает проблему, при которой приложение Facebook установлено на устройстве.

Возможно, вы используете неправильный пароль, пароль по умолчанию для хранилища ключей отладки - android

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

  1. Получите свой sha1 с помощью этого инструмента:

keytool -exportcert -keystore path-to-debug-or-production-keystore -list -v

  1. преобразовать его в base64 с помощью этого инструмента
  • да, то же самое для меня. Я сделал это правильно, но openssl что-то сделал, и это было неправильно. На это ушло 6 часов моего времени.

Ответ @Ketan Ramani помог мне, но в моем случае я не использовал LoginManager, вместо этого я регистрировал обратный вызов на изображении, если вы используете registerCallback на любом изображении, сделав его кнопкой входа, используйте код ниже

Я перепробовал все на этой странице, но безуспешно, пока я не сделал перерыв, а затем, когда я продолжаю работать над этим, ничего не меняя, он внезапно работает. Может быть (может быть) facebook нужно время зарегистрировать ключ

Вот хорошее решение для macOs, и оно работает для меня:

keytool -exportcert -alias androiddebugkey -keystore

​​/ .android / debug.keystore | openssl sha1 -binary | openssl base64

Здесь пароль хранилища ключей должен быть android. благодаря

В правой части Android Studio перейдите в Gradle -> Tasks -> android -> signingReport и запустите его. Скопируйте ключ SHA-1 и преобразуйте его в base64, используя его, а затем добавьте преобразованный хеш base64 в свое приложение в консоли разработчика Facebook. Если вы хотите использовать хэш выпуска, запустите его в командной строке: keytool -exportcert -alias YOUR_KEYSTORE_ALIAS -keystore YOUR_KEYSTORE | openssl sha1 -binary | openssl base64 где YOUR_KEYSTORE это путь к .keystore или же .jks что вы использовали как signinConfig для вашего варианта выпуска и YOUR_KEYSTORE_ALIAS - это псевдоним, который вы указали при создании хранилища ключей. Если вы не помните псевдоним, вы можете запустить keytool -v -list -keystore YOUR_KEYSTORE и увидеть всю информацию о хранилище ключей

При отладке

Скопируйте и вставьте этот код в метод OnCreate

Просто запустите команду adb logcat | grep hash и ищи что-то вроде Key hash ABCDEFGH1234= does not match any stored key . Теперь сохраните этот хеш на консоли разработчика fb.


Для современных алгоритмов шифрования одним из факторов, влияющих на криптостойкость, является длина ключа. Согласно стандарту NIST, криптографическая стойкость алгоритмов должна быть не менее 112 бит. Для симметричных алгоритмов это означает, что минимальная длина ключа должна составлять 224 бит, для асимметричных, основанных на теории чисел (например, на решении задачи факторизации для алгоритма RSA), минимальная надёжная длина - 2048 бит [1]. Не спасает от использования ключей большого размера и криптография на эллиптических кривых.

Но что поделать, если существующие ключи не обладают достаточной длиной для их безопасного использования в выбранных нами алгоритмах? Или же нам нужно получить больше ключей, чем у нас есть? Тут на помощь приходит KDF (Key Derivation Function) - это функция, которая формирует один или несколько криптографически стойких секретных ключей на основе заданного секретного значения (в литературе именуемого главным, а иногда мастер ключом) с помощью псевдослучайной функции. И что особенно важно, она позволяет задавать длину ключа, создаваемого в результате своей работы, а его стойкость будет такой же, как и у случайного ключа той же длины [2], [3].

Именно о KDF и пойдет речь далее. Мы рассмотрим общий принцип работы, одну из версий этой функции - HKDF, а также разберем, как она может быть реализована на Python'е.

Часть 1. Общий принцип работы KDF

Замечательная статья с введением в тему: ссылка

В целом, работу KDF можно представить как процесс из двух шагов, именуемый "извлечь-затем-растянуть" (по-английски - extract-and-expand):

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

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

Рассмотрим каждый из шагов работы функции более детально.

Randomness Extraction:
Первую часть нашего алгоритма - шаг извлечения ключа из входных данных - можно представить как функцию двух аргументов:

SKM (Source Keying Material) - секретное (в некоторой литературе обозначаемое как главное) значение, на основе которого формируется сначала псевдослучайный ключ PRK, а затем - ключ заданной длины или несколько ключей. Это и есть тот ключ, который "растягивает" KDF;

XTR (randomness eXTRactor) - экстрактор случайности. Его можно представить как функцию, принимающую на вход исходный ключ SKM и генерирующую на его основе выходной ключ PRK. Важное свойство этой функции заключается в том, что созданный с ее помощью ключ выглядит независимым от источника и является равномерно распределённым (в статистическом и вычислительном смысле);

PRK (PseudoRandom Key) - псевдослучайный ключ. Это значение является выходным для первого шага алгоритма;

XTSalt (eXTractor Salt) - криптографическая соль, т.е. случайное (не обязательно секретное) значение, используемое для усложнения определения прообраза функции, создающей псевдослучайный ключ. Оно может быть константой или не использоваться вовсе.

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

Key Expansion:
На втором шаге из полученного ранее псевдослучайного ключа (PRK) создается ключ заданной длины L, или же набор ключей той же суммарной длины. Также представим этот процесс в виде функции:

PRF* (PseudoRandom Function with variable length) - псевдослучайная функция, способная выдавать значения переменной длины. Для достижения этого свойства зачастую используют обычную псевдослучайную функцию с расширением выходных данных с помощью различных режимов работы, таких как counter и feedback mode;

CTXInfo (context information) - строка контекстной информации (так же, как и соль, может быть просто заданной заранее константой, в том числе нулем). Содержит в себе сведения, например, о приложении, в котором используется функция;

PRK - выходное значение первого шага;

DKM (Derived Keying Material) - выходной ключ длины L.

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

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

Конечно же, если главный ключ - уже (псевдо-)случайное значение, его можно использовать в качестве входных данных второго шага, пропустив первый. Например, premaster secret в протоколе TLS является псевдослучайной строкой, за исключением первых двух байт (IETF). Но даже в таком случае шаг извлечения может быть необходимым, если, например, размер главного ключа больше, чем того требует псевдослучайная функция PRF* (этот параметр зависит от реализации PRF* в конкретном алгоритме).

Часть 2. HKDF

HKDF (HMAC Key Derivation Function) является одной из реализаций механизма KDF. В алгоритме KDF в качестве псевдослучайной функции (обозначенной выше как PRF*), а также экстрактора псевдослучайной ключа, используется механизм HMAC.

Алгоритм HKDF
Представим схему HMAC в виде функции от двух аргументов, где первый из них - это всегда ключ, а второй - данные, которые будут хэшироваться вместе с ключом. Также обозначим как HashLen размер выходных данных (в октетах), используемый в данном алгоритме. Символом || обозначается конкатенация ("склеивание") строк. То есть под записью HMAC(key, a || b) подразумевается, что хэш-функция с заданным ключом key действует на конкатенацию a и b.

Зная это, алгоритм HKDF можно записать в виде:

где XTS, SKM и CTXInfo обозначают то же, что и в общем принципе работы KDF, а значения K(i), i = 1. t определяются согласно правилу:

K(1) = HMAC-Hash(PRK, CTXinfo || 0),
K(i+1) = HMAC-Hash(PRK, K(i) || CTXinfo || i), 1 ≤ i < t,

где t = L/HashLen - количество "блоков", необходимых для получения конечного ключа длины L. Число i в формуле для второго и последующих шагов представляется в шестнадцатеричном виде. В случае, когда требуемая длина ключа не кратна HashLen, выходным значением алгоритма являются L первых октетов K. При этом существует ограничение на L: L ≤ 255 * HashLen.

Рис 2. Схема работы HKDF [4]

Рис 2. Схема работы HKDF [4]

Как было отмечено в описании общего алгоритма KDF, соль - опциональное поле; при отсутствии предоставленного значения, на вход подается строка нулей длины HashLen. Но ее использование существенно увеличивает безопасность всей схемы, уменьшает зависимость выходного ключа от главного, и гарантирует независимость результатов работы хэш-функций, ведь значение XTSalt является ее ключом на шаге создания PRK.

@nusr_et via Instagram

@nusr_et via Instagram

Еще одним необязательным аргументом является контекстная информация. Однако для некоторых приложений она является необходимым условием работы. Дело в том, что контекст позволяет связать получившийся в результате работы алгоритма "длинный" ключ с информацией, специфичной для приложений и пользователей. Такой информацией может служить, например, номера протоколов, идентификаторы алгоритмов и т.д. Это становится особенно важным, когда разные приложения используют HKDF с одним и тем же входным главным ключом, потому что в этом случае контекст позволяет генерировать различные выходные данные. Единственным и крайне важным условием для контекстной информации является ее независимость от входного ключа SKM.

Часть 3. Реализация HKDF

Схема HKDF реализована во многих языках программирования: Java, JavaScript, PHP, Python. Рассмотрим, например, реализацию на питоне, чтобы разобраться в принципе ее работы не только на уровне описания алгоритма, но и работающей функции:

Убедимся в работоспособности примера:

Как можно увидеть, наша функция hkdf сгенерировала ключ output на основе входного ключа "input_key" и соли "add_some_salt". Обратите внимание, что на вход подаются не строки, а последовательности байтов, они лишь представлены в виде строк для наглядности. Конвертируется одно в другое вот так. Длина выходного ключа составила 100 байт, именно столько, сколько мы потребовали первым аргументом!

Читайте также: