Подписание данных в приложении c ++ с использованием CNG и проверка в php api - PullRequest
1 голос
/ 09 мая 2019

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

Что мне нужно:

  1. Создать 1 закрытый и 1 открытый ключ только один раз.
  2. Включите закрытый ключ в мое приложение на C ++, чтобы пользователь не мог его прочитать (все может быть взломано, но вы понимаете, о чем я, не позволяйте пользователю видеть его в виде обычного текста).
  3. Распространение приложения.
  4. Тогда мое приложение, когда оно будет использовано, будет хэшировать строку.
  5. Зашифруйте этот хеш с помощью закрытого ключа.
  6. Отправьте этот подписанный хэш моему API, используя http-запрос.
  7. Расшифруйте подписанный хеш в моем API (php) с помощью моего открытого ключа.

Чего я не понимаю:

Используя приведенный здесь пример: Подписание данных с помощью CNG Я не понимаю, как можно создать ключи один раз, а затем сохранить частный в моем приложении c ++ и публичный в моем API (php).

Чего я достиг

Я научился хешировать и шифровать / дешифровать данные с помощью bCrypt, но я не понимаю, какие шаги мне нужно сделать, чтобы достичь того, что я написал до

1 Ответ

0 голосов
/ 17 мая 2019

Вы должны изменить дизайн.В настоящее время ваш дизайн имеет большой недостаток безопасности.Вы правильно поняли pubkey / prikey, но реализация неверна.Закрытый ключ должен быть закрытым.В настоящее время легко получить открытый ключ, учитывая закрытый ключ для множества алгоритмов, но не наоборот.Правильный дизайн выглядит следующим образом.

  1. Создание самозаверяющего сертификата.Этот сертификат будет содержать закрытый и открытый ключ
  2. Экспортировать открытый сертификат и встроить его в качестве ресурса / или жестко закодировать в приложение, которое вы собираетесь распространять
  3. Приложение затем будет хэшировать данные вподписаться и использовать открытый ключ из ресурса приложения.
  4. Эти хешированные данные затем отправляются по http на ваш сервер, на котором есть копия закрытого ключа.
  5. Сервер будет хэшировать данныеи проверьте хеш с закрытым ключом.

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

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

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

Часть закрытого ключа пары ключей никогда не должна жестко кодироваться ни в одном приложении.Закрытый ключ не должен экспортироваться и управляться только операционной системой.В Windows теперь есть клавиатурный щиток, использующий технологию VSM, благодаря которой даже локальный администратор не может знать секретный ключ.Администратор может использовать его только для подписи и проверки (и экспорта ключа, если экспорт разрешен), но никогда не сможет просматривать закрытый ключ и злоупотреблять им.

Относительно пошагового процесса.

  1. Создать самозаверяющий сертификат.Это создаст сертификат с открытым и закрытым ключом в файле pfx.
  2. Импортируйте самоподписанный сертификат в хранилище сертификатов.Этого можно добиться, просто дважды щелкнув файл и следуя инструкциям.
  3. Экспортируйте открытую часть нового импортированного сертификата, открыв диспетчер сертификатов.
  4. Вы можете встроить этот открытый экспортированныйсертификат в приложении в качестве ресурса.
  5. Затем приложение может загрузить сертификат из ресурса и использовать его для подписи хэша.
  6. На стороне сервера, если сертификат с закрытым ключом имеет значениееще не импортирован, выполните шаг 2 для его импорта.
  7. Сервер может затем использовать Apis для проверки подписанных данных с помощью закрытого ключа.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...