Вопрос по php, encoding, encryption, obfuscation – запутать или зашифровать некоторые текстовые данные в PHP

12

Мне нужно запутать или зашифровать некоторые текстовые данные в моем приложении php 5.2.

Я бы предпочел решение, в котором входная строка и выходная строка сохраняли бы одинаковую длину.

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

ключевые соображения

EDIT ADD I'd prefer a solution that would have input string and output string retain the same length. only string text will be obfuscated/encrypted for storage in a database the php application will need to obfuscate/encrypt the data before the database save and will need to un-obfuscate/dencrypt following the database read this is a modification to an existing application only some columns will need to be obfuscated/encrypted only some rows will need to be obfuscated/encrypted, based on a Type field there are only a few load/save points to handle max column size is already determined for some fields, but not for others, but I'd prefer a solution to work within the existing size of the restricted fields EDIT, ADD the key will be probably be a composite of some Primary key info +uneditable fields

Вот пример таблицы базы данных и данных:

<code>int           char(1) varchar(24)              int      date
MyPrimaryKey  RowType UserText                 UserNo   DateChange
------------  ------- ------------------------ -------- ----------------
1             N       nothing special here     43       6/20/2009 12:11am
2             N       same thing, wow!         78       6/23/2009 1:03pm
3             S       fBJKg}[email protected] 43       6/25/2009 6:45am
4             N       same old, same old text  21       6/25/2009 8:11am
</code>

Приложение будет загружать и отображать строки 1, 2 и 4 нормально. Однако он будет условно (в зависимости от типа строки) обрабатывать текст в строке 3, используя эту логику запутывания / шифрования и не-запутывания / дешифрования.

Кто-нибудь может предоставить обфусцировать / зашифровать и не обфусцировать / расшифровать код функций, ссылки и / или указатель, которые могли бы помочь здесь?

Спасибо!

EDIT
Мне нравится простая идея кодирования base64, но есть ли метод, который может держать данные в пределах фиксированного размера. Все перечисленные методы имеют выходное значение больше, чем входное значение. Это будет проблемой для некоторых столбцов, где пользователь может ввести 50 символов, и он будет сохранен в столбце varchar (50).

Если вы не можете доверять людям, которые имеют прямой доступ к вашим системам & amp; В вашей БД вы либо должны быть более строгими в отношении того, кто может получить доступ к системам, либо привлечь других людей. Sean McSomething
Нужно ли вам решение, чтобы просто быть не читаемым или не взломанным. user1637281
Между кодированием и шифрованием существует большая разница, поэтому я не понимаю, почему вы относитесь к ним как к схожим процессам. Сначала вы должны ответить на несколько вопросов: являются ли данные конфиденциальными или нет, имеют ли разработчики прямой доступ к базе данных, если вы можете согласиться с тем, что несколько разработчиков могут декодировать сообщения, чем полезна эта схема защиты. Если вы используете base64, любой может экспортировать список и декодировать его. Wadih M.
@Sean McSomething, я не хочу видеть данные, когда работаю в системе, и я доверяю себе. KM.
@ Вади М., для этого проекта заданы требования хранить его в виде обычного текста в базе данных и ограничивать доступ пользователя к нему через приложение. Я собираюсь пойти дальше этого с минимальной / простой функциональностью запутывания / шифрования, потому что я не хочу "видеть" данные, когда я работаю в системе. С полным доступом к исходному коду любой другой разработчик сможет выяснить, как он кодируется, и они могут, если захотят, но, вероятно, они тоже этого не хотят. Если это так, то нет большой проблемы, мы не храним сверхсекретные данные. KM.

Ваш Ответ

7   ответов
4

Если у вас установлен mcrypt (все мои текущие PHP-среды), вы можете использоватьmcrypt_encrypt а такжеmcrypt_decrypt как это:

function encrypt ($text) {
  global $key;
  return mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, "abcdefghijklmnopqrstuvwxyz012345");
}

function decrypt ($secret) {
  global $key;
  return rtrim (mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $key, $secret, MCRYPT_MODE_ECB, "abcdefghijklmnopqrstuvwxyz012345"), "\0");
}

который использует глобальный$key и AES (очень сильный).

Недостатками являются производительность (по сравнению с более простыми, такими как Base64) и то, что вам как-то приходится исправлять ключ.

Ура,

17

е символы:
строкаstrtr ( string $str , string $from , string $to )

to encode in php:

$readable='This is a special test string ABC123 ([+,-!#$%&*])';    
$unreadable=strtr($readable,' !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'
                           ,'¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ '
                      );
print $unreadable; //outputs: "ÕéêôAêôAâAôñæäêâíAõæôõAôõóêïèAÂÃIJ³´A©Ü¬­®¢¤¥¦§«Þª"

to decode in php:

$unreadable='ÕéêôAêôAâAôñæäêâíAõæôõAôõóêïèAÂÃIJ³´A©Ü¬­®¢¤¥¦§«Þª';
$readable=strtr($unreadable,'¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ '
                           ,' !"#$%&\'()*+,-./0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'

               );
print $readable; //outputs: "This is a special test string ABC123 ([+,-!#$%&*])"

при необходимости вы можете легко воспроизвести эту логику в БД (без зацикливания):Используя таблицу чисел, Эрланд Соммарског

Вероятно, что-то в этом роде, если у вас есть таблица чисел, просто используйте CHAR, что-то в строкахselect char(number) from numbers where number<255 KM.
Мне действительно нравится идея base 64, но мне нужны данные, чтобы вписаться в существующие поля базы данных. Функция rot13 () была довольно простой и имела тот же размер, но этот strtr () достаточно хорош для моих целей. KM.
Как вы выбрали или сгенерировали строки, которые используете выше? rot13 выглядит проще, зачем сложность?
Да, я знаю. Я спрашивал, как вы генерировали две строки. Мне лень считать, но похоже, что вы взяли ASCI (256 символов) и сместили 128 символов
@pure_code, из руководства: кодировка ROT13 просто сдвигает каждую букву на 13 позиций в алфавитеwhile leaving non-alpha characters untouched. Кодирование и декодирование выполняются одной и той же функцией. Передача закодированной строки в качестве аргумента вернет исходную версию. это было не слишком сложно, но намного сложнее получить какую-либо информацию из закодированной строки. KM.
5

Если вы хотите очень сильный, вы можете посмотреть вMcrypt.

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

7

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

Есть некоторые замки, которые существуют только для того, чтобы честные люди были честными.
Нашей заботой было не "зашифровать" просто чтобы сделать его "не легко читаемым". Я был одним из разработчиков, и да, я мог бы расшифровать любой из них в секунду.
@Colin: вы не делаетеhave сохранять честных людей честными; что & APOS; swhy они честны! ... тьфу. Купорос не совсем нацелен на вас, просто мне надоело слышать этот тупой аргумент от RIAA и MPAA.
oO У вас работают разработчики, которые не могут определить и декодировать base64? (шучу, не могу устоять ...)
@ Дэвид Томас На самом деле вы можете "сохранять честность честных людей". Представьте себе - вам нужно работать с базой данных, которая содержит личные SMS-сообщения, и вы, будучи честным человеком, не хотите читать этот частный материал. Если сообщения хранятся в виде простого текста, вы не сможете их не читать ». потому что вы не можете "отключить" режим чтения "quot; в твоем мозгу. Чтение приватных вещей может сделать вас менее честным, поэтому base64 достаточно хорош, чтобы этого избежать. Это не защищает от нечестности, но помогает предотвратить дискомфорт для честных разработчиков, которые не хотят видеть личную информацию.
2

Попробуйте использовать библиотеку mcrypt. Он не включен в стандартный PHP, но его легко загружать и он очень часто используется. Здесь & APOS; sкраткое руководство на то, что вы можете сделать с этим.

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

3

вам даже не нужно много php для этого, вы можете сделать это внутри запроса с помощью строковых функций mysqlencrypt(text, password) а такжеdecrypt(text, password)

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

DECODE(crypt_str,pass_str)

Decrypts the encrypted string crypt_str using pass_str as the password. crypt_str should be a string returned from ENCODE().

ENCODE(str,pass_str)

Encrypt str using pass_str as the password. To decrypt the result, use DECODE().

The result is a binary string of the same length as str.

The strength of the encryption is based on how good the random generator is. It should suffice for short strings.

обновление: другая возможность будетrot13 ^^

@ricebowl, но мне нужно только простое решение KM.
Мне действительно нравится вывод строки той же длины, однако я не использую mysql. Rot13 выглядит многообещающе KM.
rot13 действительно была шуткой. rot13 ВСЕГДА шутка ^^
Но ... я думаю, что rot13 была шуткой.
rot13 идеально подходит, если вам нужно что-то нечитаемое, но не взломанное.
4

convert_uuencode а такжеconvert_uudecode:

function encrypt_decrypt ($data, $encrypt) {
    if ($encrypt == true) {
        $output = base64_encode (convert_uuencode ($data));
    } else {
        $output = convert_uudecode (base64_decode ($data));
    }
    return $output;
}

$enc_txt = encrypt_decrypt ("HELLO DATA", true);
echo $enc_txt."\n"; // KjIkNSwzJFxAMSQlNDAwYGAKYAo=
echo encrypt_decrypt ($enc_txt, false); // HELLO DATA
Почему вы проигнорировали слово "длина"?
Функции не требуют этого

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