Мне нужно обфускать или зашифровать некоторые текстовые данные в моем приложении php 5.2.
Я бы предпочел решение, в котором входная строка и строка вывода сохраняли бы ту же длину.
Это не должно быть чрезвычайно сильным, так как существует множество других уровней безопасности. Сильный был бы хорош, но это просто заставит программистов / dba / поддерживать людей / etc случайно прослушивать текст из базы данных.
ключевые соображения
здесь приведен пример таблицы и данных базы данных:
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, но он легко загружается и очень часто используется. Вот краткое руководство по тому, что вы можете с ним сделать.
Лучше всего убедиться, что ключ, который вы используете для шифрования, хранится в безопасном месте, но если вы действительно не заботитесь о безопасности, вы, вероятно, будете в порядке, просто скопируйте ключ в свой код где-нибудь.