Предоставление зашифрованных данных и средств их расшифровки небезопасно? - PullRequest
0 голосов
/ 17 февраля 2012

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

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

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

require("backend-api.php");

$myUserID = "bobs-restaurant.com";
$myPublicKey = "sdg136MAGHYasfadgHGQ"; //send this with the request
$myPrivateKey = "adgljavd8i1356avdilj"; //never send this anywhere
$queryName = "LIST_OF_DISHES";

$backend = new backend-api();
$response = $backend->getData($myUserID,$myPublicKey,$queryName);

$list_of_dishes = $backend->decrypt($response,$myPrivateKey);

//user then goes on to use the data in their code or maybe just display it as-is.

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

Предполагая, что вышеуказанные ID пользователя и открытый ключ былисовпадение, запрос существовал и возвращал данные - моя система зашифровывала ответ на закрытый ключ, который известен пользователю ($ myPrivateKey) и который известен моей системе, но никогда не передавался между ними взапрос, чтобы он не мог быть перехвачен, и я собирался использовать что-то вроде это обратимое шифрование клаss для шифрования.

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

Так что, если г-н Malicious каким-то образом получает ID пользователя и открытый ключ, принадлежащий кому-то другому, и он загрузил копию класса расшифровки из учебного руководства / руководства пользователя на моем системном веб-сайте, я прав, говоря, что ему не нужно будетзнаете закрытый ключ, потому что он мог бы просто разобраться, как его расшифровать, изучив код?

Если ответ да, то что я об этом не подумал, это предотвратит это?

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Хороший метод шифрования никогда не опирается на людей, не знающих, как он работает для его безопасности.Фактически, если вы собираетесь использовать шифрование, вы никогда не захотите попробовать свои собственные.Если метод, используемый для шифрования чего-либо, прост, например, ROT13 , то да, зная, что метод позволит злоумышленнику довольно легко расшифровать его.

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

Самая большая проблема, с которой вы столкнулись, заключается в том, что и класс шифрования, который вы связали, и AES симметричные или методы шифрования с предварительным общим ключом .Это означает, что вы должны использовать один и тот же ключ для шифрования и дешифрования данных.Это не работает для ваших целей, потому что вы и ваши пользователи не знаете один и тот же ключ.Если у вас есть способ узнать тот же ключ, проверьте mcrypt для PHP

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

1 голос
/ 17 февраля 2012

Мистер Злобный не знает, как расшифровать что-либо, просто изучив код.Лучшее, что он мог сделать, - это грубо взломать «закрытый ключ».

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

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

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

...