Могу ли я предоставить зашифрованную строку пользователям и убедиться, что она безопасна в течение 1-2 часов
Мы делали простую игру,
в котором:
- Пользователи получают
next number of play
как encrypted string
До, они играют
- После они играют, шифрование
password
предоставляется им для проверки правильности номера воспроизведения.
- Каждая зашифрованная строка
only valid for 1-2 hours
, а число воспроизведения, проверка строки и зашифрованной строки снова восстанавливается после этого времени
- Зашифрованная строка содержит код проверки (5 char), поэтому оба пользователя и мы можем убедиться, что процесс дешифрования прошел успешно
Пример символа для шифрования (QQ9LU
- это случайный код проверки, предоставленный пользователю перед игрой):
Следующий номер воспроизведения: 8 - Проверка строки: QQ9LU
Пример зашифрованной строки (предоставляется пользователю перед воспроизведением):
NXRykKOv3B6kuu4Ke3svp7HH3enNiqIZrJSXJiF54QkHHjtXgqpUXxyuP7YUNICeFLg ==
Образец пароля (предоставляется после игры):
Обратите внимание, что это генерируется случайным образом для каждого шифрования
FA00RDjA77hlOzcOzH6kuGcc29CyM7Hw
Мы используем CodeIgniter 2.2.2 Encryption Class для шифрования/расшифровки строк
Информация о методе шифрования:
- Используемая функция:
$this->encrypt->encode($msg, $pass);
со случайным проходом каждый раз
- Cipher - это CodeIgniter 2 по умолчанию
MCRYPT_RIJNDAEL_256
- Режим Mcrypt
MCRYPT_MODE_CBC
Мои вопросы:
-
Могу ли я доверять тому, что пользователи не могут сломать зашифрованную строку (и узнать количество игр до того, как они получат пароль) через 1-2 часа (кроме удачи)
-
Является ли случайный код подтверждения Verify String: T3YH4
там хорошим или плохим? это влияет на безопасность? (это означает, что результат дешифрования был успешным, также мы добавили его, потому что единственная переменная в каждой строке была одной цифрой, например, только номер 8 изменился на 7, поэтому мы хотели добавить в строку больше символов переменной, чтобы, возможно, лучшая безопасность)
Любое другое предложение оценено
Ответы
Ответ 1
Краткие ответы:
- Из технического POV то, что вы делаете, небезопасно, хотя этого может быть достаточно всего за 2 часа.
- То, что вы пытаетесь сделать здесь, называется "аутентификация сообщения", но это не то, как это должно быть сделано, что, в свою очередь, влияет на безопасность. Вместо этого вы должны использовать HMAC.
Моим советом было бы перейти на CodeIgniter 3 (CI2 перестанет получать даже обновления для системы безопасности через несколько месяцев) как можно скорее и вместо этого использовать новую библиотеку Encryption. Это сделает его безопасным в течение многих лет, а не часов.
Длинный ответ:
Библиотека шифрования должна выполнять как шифрование, так и аутентификацию для вас, но, к сожалению, класс CI_Encrypt
плохо написан и не обладает большой функциональностью (например, аутентификацией), поэтому он был DEPRECATED и заменен на новая библиотека (CI_Encryption
) в CodeIgniter 3.
Объяснение всех недостатков здесь было бы довольно сложной задачей, поэтому я бы скорее связал вас с внешней статьей (не самоокупающейся, не волнуйтесь), что делает это довольно хорошо, если вы заинтересованы в деталях низкого уровня.
Независимо от того, какую библиотеку вы используете, нужно отметить одно: пароль - это не то же самое, что ключ шифрования.
Пароли имеют различную длину и используются людьми, а это значит, что они должны быть доступны для чтения людьми, а это, в свою очередь, ограничивает их определенным набором символов.
С другой стороны, ключи шифрования имеют фиксированную длину (каждый алгоритм шифрования предназначен для работы с определенной длиной ключа, для Rijndael-256 - 32 байта, которые, по-видимому, соответствуют) и не ограничиваются человекочитаемыми символами (что означает большую энтропию и, следовательно, большую безопасность) - они представляют собой сырые двоичные данные.
Все остальное может управляться (и, следовательно, автоматически выполняется) библиотекой, но если вы передаете пароль вместо ключа - то, что будет использовать библиотека, поэтому вам следует позаботиться об этом.
Ответ 2
Лучший и простой способ сделать это - использовать функции файловой системы для создания простого текстового файла для каждого пользователя в не общедоступном пути с двумя строками, первая из которых является уникальной случайной строкой (длинная строка варьируется по длине) а второе - это число.
Затем, используя sha1_file
, получите хэш-значение файла, затем сохраните его в базе данных, связанной с его контуром, и создайте время, затем отправьте этот хэш пользователю.
После того, как пользователь сыграл, проверьте значение другим script, который получает значение хэша из базы данных, затем прочитайте файл и проанализируйте его вторую строку, чтобы отобразить номер.
Таким образом, вы предоставили пользователю хэш не для строки, но это для файла и взломать его, чтобы вернуть файл, не просто, как это делается через два часа.
Ответ 3
Вы предоставляете свою логику шифрования/дешифрования на стороне клиента. Хакер легко определит, как совпадают ваши пароли и строки шифрования.
У многих фреймворков есть своя собственная генерация паролей и сравнение логик. Yii с использованием SALT и других функций, таких как SHA1 и т.д.
Держите его простым и держите все на своем месте. Создайте свои вещи шифрования и сохраните их в конце. Следуйте простым шагам,
- Создайте пароль шифрования (используя SALT и/или другие инструменты шифрования) и сохраните в конце.
- Попросите клиента (пользователя) ввести свой пароль (ключ) и получить на стороне сервера
- Преобразуйте свой пароль (ключ) в пароль шифрования и сравните
CPasswordHelper будет вам полезен. Попробуйте загрузить исходный код Yii и потушить свою логику для вас.
Надеюсь, что это поможет!
Ответ 4
Звучит как веселая игра!
Я предполагаю, что вы создаете эти строки в файлах в файловой системе. Если вы размещаете их в каком-либо веб-приложении, которое предполагает различные методы для разрыва строки.
Добавление кода в конец строки называется солярированием строки. Хотя это делает строку сложнее угадать, если вы добавляете твердую кодовую соль вместо случайно генерируемой соли, ее все же можно легко сломать методами грубой силы.
Я бы попытался использовать одностороннюю хэшированную строку для пароля и сохранить ее в базе данных. Пользователь не может расшифровать строку и должен просто предоставить соответствующий пароль, чтобы получить доступ к вашей строке. Программы могут прерывать односторонние хешированные строки, но я считаю маловероятным, что кто-то будет достаточно умен, чтобы сделать это, если они находятся в колледже, и у них есть только два часа. Требуется много знаний и опыта домена, чтобы начать генерировать односторонние хешированные строки, чтобы переборщить его.
Кроме того, вы, вероятно, безопасны с помощью метода, который вы сейчас делаете, студенты вряд ли смогут сломать строку за 2 часа, если они не знакомы с передовыми сценариями взлома шифрования, которые требуют некоторой работы для поиска. Я предполагаю, что они будут делать проб и ошибок, используя разные библиотеки расшифровки, похожие на пример, который вы предоставляете, и надеетесь, что им повезет с библиотекой строк, которые они пытаются сопоставить с вашими.
Также важна информация с любым типом шифрования. Говоря кому-то, что вы добавляете 5 кодонов в свою строку, вы получите некоторое представление о том, как работает ваш алгоритм шифрования. Затем они могут попытаться использовать методы их разбиения на основе информации, которую вы им даете. Попробуйте одно и то же с вашим собственным алгоритмом и оставите учеников в темноте, я сомневаюсь, что кто-нибудь сломает что-нибудь за раз. Многие из методов взлома включают в себя процесс сбора информации, где хакер просматривает или сопоставляет систему, прежде чем пытаться атаковать его.