обфускация или шифрование некоторых текстовых данных в PHP

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

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

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

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

  • EDIT ADD Я бы предпочел решение, в котором строка ввода и строка вывода сохранялись бы одинаковой длины.
  • только строковый текст будет обфускации / зашифрован для хранения в базе данных
  • php-приложение должно будет обфускать / зашифровать данные до сохранения базы данных и будет необходимо un-obfuscate / dencrypt после чтения базы данных
  • это изменение существующего приложения
  • только некоторые столбцы должны быть обфускации / зашифрованы
  • только некоторые строки должны быть обфускации / зашифрованы на основе поля «Тип»
  • есть только несколько точек загрузки / сохранения
  • Максимальный размер столбца уже определен для некоторых полей, но не для других, но я бы предпочел, чтобы решение работало с существующим размером ограниченных полей
  • EDIT, ADD ключ, вероятно, будет составным из некоторых первичных ключевых данных + неотредактируемых полей

здесь приведен пример таблицы и данных базы данных:

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}.jkjWfF78dlg@45kjg 43 6/25/2009 6:45am 4 N same old, same old text 21 6/25/2009 8:11am 

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

Может ли кто-либо предоставлять функции obfuscate / encrypt и un-obfuscate / decrypt, код, ссылки и / или указатель, которые помогут здесь?

благодаря!

РЕДАКТИРОВАТЬ
Мне нравится простая идея кодирования base64, но есть метод, который может хранить данные в фиксированном размере. Все методы, перечисленные до сих пор, имеют выходное значение, большее входного значения. Это будет проблемой для некоторых столбцов, где пользователь может ввести 50 символов, и он хранится в столбце varchar (50).

для простого обфускации используйте strtr () – Перевести определенные символы:
string strtr (string $ str, string $ from, string $ to)

для кодирования в php:

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

для декодирования в php:

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

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

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

Есть несколько вариантов.

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

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

Если у вас установлен 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), и вам как-то нужно исправить ключ.

Ура,

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

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

  • DECODE(crypt_str,pass_str)

    Расшифровывает зашифрованную строку crypt_str с использованием pass_str в качестве пароля. crypt_str должна быть строкой, возвращаемой из ENCODE ().

  • ENCODE(str,pass_str)

    Зашифруйте страницу с помощью пароля pass_str. Чтобы расшифровать результат, используйте DECODE ().

    Результатом является двоичная строка той же длины, что и str.

    Сила шифрования основана на том, насколько хорош случайный генератор. Этого достаточно для коротких строк.

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

Попробуйте эти функции PHP 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 

Попробуйте использовать библиотеку mcrypt. Он не входит в стандартный PHP, но он легко загружается и очень часто используется. Вот краткое руководство по тому, что вы можете с ним сделать.

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