запутать или зашифровать некоторые текстовые данные в PHP - PullRequest
12 голосов
/ 25 июня 2009

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

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

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

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

  • РЕДАКТИРОВАТЬ, ДОБАВИТЬ Я бы предпочел решение, в котором входная строка и выходная строка сохраняли бы одинаковую длину.
  • только текст строки будет запутан / зашифрован для хранения в базе данных
  • Приложению php потребуется сохранить данные в зашифрованном виде / зашифровать их перед сохранением базы данных, а также необходимо будет удалить / скрыть их после чтения базы данных
  • это модификация существующего приложения
  • только некоторые столбцы должны быть запутаны / зашифрованы
  • только некоторые строки должны быть запутаны / зашифрованы, основываясь на поле Тип
  • есть только несколько точек загрузки / сохранения для обработки
  • максимальный размер столбца уже определен для некоторых полей, но не для других, но я бы предпочел, чтобы решение работало в рамках существующего размера ограниченных полей
  • РЕДАКТИРОВАТЬ, ДОБАВИТЬ ключ, вероятно, будет составным из некоторой информации первичного ключа + не редактируемые поля

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

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 с использованием этой логики запутывания / шифрования и снятия запутывания / дешифрования.

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

спасибо!

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

Ответы [ 7 ]

17 голосов
/ 27 июня 2009

для простой обфускации используйте strtr () - перевести определенные символы:
строка strtr (строка $ str, строка $ from, строка $ 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 ([+,-!#$%&*])"

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

7 голосов
/ 25 июня 2009

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

5 голосов
/ 25 июня 2009

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

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

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

4 голосов
/ 26 марта 2014

Попробуйте эти функции 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
4 голосов
/ 25 июня 2009

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

Приветствия

3 голосов
/ 25 июня 2009

если вы используете 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)

    Шифрование str с использованием pass_str в качестве пароля. Чтобы расшифровать результат, используйте DECODE ().

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

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

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

2 голосов
/ 25 июня 2009

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

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

...