2015-10-20 2 views
0

Это задание. Мне нужно создать веб-приложение в движке Google и применить алгоритм rsa для хранения данных в хранилище данных приложения. Мое приложение просто хранит небольшие заметки, созданные пользователем. Я закончил приложение, а также применил RSA для шифрования сообщений (получил код от Implementing RSA algorithm). Для этого я разделяю строку и конвертирую каждый символ в ascii, а затем сохраняю их в повторном ndb.IntegerProperty, но я не понимаю, как должны обрабатываться частные и открытые ключи. Я хочу знать, где хранить закрытый ключ и как только записятся заметки, и пользователь снова обращается к ним, как мне получить открытый и закрытый ключ? Должен ли я хранить их ключи в хранилище данных?Внедрение RSA в Google App Engine webapp

Шифрование выполняется на сервере для шифрования заметок, сохраненных пользователем. Заметки представляют собой строки, которые разбиты на символы, а их значения ascii затем зашифровываются. Все это делается на стороне сервера, как только пользователь нажимает «добавить примечание».

Дешифрование выполняется на стороне сервера при входе пользователя в систему, а его идентификатор пользователя используется для извлечения сохраненных заметок, которые дешифруются, чтобы получить исходные значения ascii, а затем сформировать исходную строку.

В настоящее время существует только одна пара ключей, которая генерируется в коде. ссылка на приложение: http://cloudassignment-1102.appspot.com

Сообщите мне, если мне нужно добавить исходный код.

+0

Я обновил свой ответ. Мне сложно дать вам 100% -ный ответ, потому что это действительно пример бесполезного упражнения, поэтому верный ответ на то, где вы должны хранить свои ключи, - «где бы вы ни хотели». Для простоты я рекомендую использовать хранилище данных, как описано в моем редактировании для ответа. – konqi

ответ

1

В идеале вы храните секретный ключ где-то (очень) безопасно. Поскольку GAE является платформой вашего выбора у вас есть несколько вариантов:

  • Поместите ключ где-то в вашем проекте, где он доступен для чтения исходного кода, но не является общедоступной (В Java это обычно папка ресурсов или WEB-INF, не уверен, что такое эквивалент для python)
  • Используйте облачное хранилище и поместите там свой файл. Это немного накладные расходы, но если вы когда-либо захотите изменить ключевой стиль открытого сердца ...
  • Поскольку ключ в основном представляет собой массив байтов, вы можете определить их как постоянный массив байтов в вашем источнике. Очевидно, это был бы наименее гибкий выбор.

EDIT:

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

Но в духе делать глупые вещи и обучения в то время как у него:

Я предполагаю, что ваш код генерирует пары ключей для каждого пользователя. Поэтому невозможно сохранить ключи в качестве констант в вашем коде (файловая система GAE только для чтения). Скорее вы можете использовать любую базу данных, которую вы хотите (будь то облачный хранилище данных или облачный sql).

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

Секретный ключ может храниться в одном хранилище (хранилище данных/облако sql?), но я бы отделил его, чтобы вы не могли запросить его и передать его случайно. Необходимо добавить дополнительную таблицу/объект со ссылкой на пользователя.

+0

ОК, поэтому я храню закрытый ключ в своем коде и как насчет открытого ключа? Должен ли я иметь другой ndb.model для сопоставления закрытого ключа с конкретным пользователем? – user3542154

+0

Не имеет значения, где находится открытый ключ. Это может быть публично. Но подождите ... Есть ли пара ключей для каждого пользователя? Если это так, то все шифрование/дешифрование должно происходить на стороне клиента, и вам придется обрабатывать хранение ключей на стороне клиента. Это сделало бы данные пользователя безопасными, даже от вас самих :-) – konqi

+0

, но где я его публично храню? Должен ли я держать их в коде? Да, я понимаю, что сохранение пары ключей для каждого пользователя будет более безопасным, но как я могу справиться с хранением ключей на стороне клиента? для закрытого ключа, я думаю, я могу просто сохранить их в облаке sql – user3542154

Смежные вопросы