Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Строка из mcrypt_encrypt, запись в бд
Форумы портала PHP.SU » » Вопросы новичков » Строка из mcrypt_encrypt, запись в бд

Страниц (1): [1]
 

1. Tox - 12 Августа, 2012 - 13:36:02 - перейти к сообщению
Проблема в том, что строка в бд не пишется:
PHP:
скопировать код в буфер обмена
  1. $t = mcrypt_ecb ( MCRYPT_3DES , $key , $token , MCRYPT_ENCRYPT );
  2. mysql_query("Update user SET `t`='".$t."' where `id`=1;");
  3. echo mysql_errno() . ": " . mysql_error() . "\n";// - сообщения об ошибках

Все время ошибки вроде:
1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?Z'?' at line 1
Поскольку функция возвращает строку, тип поля VARCHAR(255). Может '".$t."' надо еще как-то преобразовать?

Почему 3DES? Бессмертный ЯД рекомендует.
2. Hawkmoth - 12 Августа, 2012 - 13:46:45 - перейти к сообщению
Не работал с этой функцией, но
php.net пишет:
This function is deprecated and should not be used anymore, see mcrypt_generic() and mdecrypt_generic() for replacements.

А судя по ошибке, в сгенеренной строке проскакивает одинарная кавычка, которую бы надо экранировать.
3. Tox - 12 Августа, 2012 - 14:14:28 - перейти к сообщению
А как ее заэкранировать? Поиск по строке, замена ' на \' ?
PHP:
скопировать код в буфер обмена
  1. /* Открывает модуль и создаёт IV */
  2. $td = mcrypt_module_open ('des', '', 'ecb', '');
  3. // кей объявлен, в нем строка, 5 символов
  4. $key = substr ($key, 0, mcrypt_enc_get_key_size ($td));
  5. $iv_size = mcrypt_enc_get_iv_size ($td);
  6. $iv = mcrypt_create_iv ($iv_size, MCRYPT_RAND);
  7.  
  8. /* Инициализирует дескриптор шифрования */
  9. if (mcrypt_generic_init ($td, $key, $iv) != -1) {
  10.  
  11. /* Шифрует данные */
  12. $c_t = mcrypt_generic ($td, $token);
  13.  
  14.  
  15. }
  16.  
  17.  
  18.  
  19.     mysql_query("Update user SET `t`='".$c_t."' where id=1;");
  20. echo mysql_errno() . ": " . mysql_error() . "\n";// - сообщения об ошибках



1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'xS??E?X?L????????`,???z?%?????G^-e??Hfꥂ].ؘ^????P?y??????[????k7? ??q?y' at line 1
4. Мелкий - 12 Августа, 2012 - 14:20:20 - перейти к сообщению
Tox пишет:
to use near '?Z'?

Судя по этому, функция возвращает бинарные данные. Экранирование где?
И тип поля в этом случае лучше BINARY или VARBINARY
5. Tox - 12 Августа, 2012 - 14:23:23 - перейти к сообщению
Мелкий пишет:
Tox пишет:
to use near '?Z'?

Судя по этому, функция возвращает бинарные данные. Экранирование где?
И тип поля в этом случае лучше BINARY или VARBINARY

Я тоже так думал, но функция-то строку возвращает. BINARY не работал, писал "d2".
Для записи $c_t

использовать VARBINARY?
6. Hawkmoth - 12 Августа, 2012 - 14:26:28 - перейти к сообщению
Для начала mysql_real_escape_string($c_t) перед вставкой в базу
7. Tox - 12 Августа, 2012 - 14:39:16 - перейти к сообщению
Спасибо, с VARBINARY и mysql_real_escape_string все работает.
(Добавление)
При дешифрировании опять "символы" стали появляться, после выборки из бд снова стал экранировать, но проблема не исчезла. Кстати, перед записью в бд экранирование не всегда работает.
PHP:
скопировать код в буфер обмена
  1. $td = mcrypt_module_open ('des', '', 'ecb', '');
  2. $key = substr ($key, 0, mcrypt_enc_get_key_size ($td));
  3. $iv_size = mcrypt_enc_get_iv_size ($td);
  4. $iv = mcrypt_create_iv ($iv_size, MCRYPT_RAND);
  5. /* Инициализирует дескриптор шифрования */
  6. if (mcrypt_generic_init ($td, $key, $iv) != -1) {
  7. /* Реинициализирует буферы для дешифрования */
  8. mcrypt_generic_init ($td, $key, $iv);
  9. $token = mdecrypt_generic ($td, $row['T']);
  10. /* Зачистка */
  11. }
  12.  

Просто Яд настаивает на том, чтобы шифровать токены юзеров,причем в 3DES, кто-нибудь вообще токены шифровал?) Что самое интересное, ключи и "секреты" в коде шифровать не надо, там же и ключевое слово, а токены шифровать обязательно.
Я уже начал подумывать о написании своего алгоритма.
(Добавление)
Забавно, но чтобы шифровать токены, нужна лицензия:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  Российской Федерации коммерческая деятельность, связанная с использованием криптографических средств, подлежит обязательному лицензированию. С 22 января 2008 года действует Постановление Правительства РФ от 29 декабря 2007 N 957 «Об утверждении положений о лицензировании отдельных видов деятельности, связанных с шифровальными (криптографическими) средствами», которым приняты Положения о лицензировании деятельности по:
  2. распространению шифровальных (криптографических) средств
  3. техническому обслуживанию шифровальных (криптографических) средств
  4. предоставлению услуг в области шифрования информации
  5. разработке, производству шифровальных (криптографических) средств, защищенных с использованием шифровальных (криптографических) средств информационных и телекоммуникационных систем

Это из вики.
Сюда попадает шифрование данных юзера?

 

Powered by ExBB FM 1.0 RC1