PHP + AES Глюк безопасности - PullRequest
       4

PHP + AES Глюк безопасности

0 голосов
/ 23 сентября 2010

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

Я ВЕРИМ, я знаюгде он находится, но я не знаю, как / где это исправить.В настоящее время у меня есть PHP 5 и последняя версия MySQL, запущенная на моем локальном сервере.

Вот небольшой тест, который я запускаю, который, кажется, отлично работает.

<?php

$fName = "Giesbrecht";

$fNameEncrypt = common::encryptMe($fName);
echo $fNameEncrypt ."<br />";
echo common::decryptMe($fNameEncrypt);

?>

Моя функция для фактического использованияобщие: encryptMe ()

public static function encryptMe ($value)
// USE THE AES ENCRYPTION TO ENCRYPT ANY VALUE
{
   include_once('../resources/crypt/AES.php');

   $aes = new Crypt_AES();
   $aes->setKey(AES_KEY);
   return $aes->encrypt($value);
}

Таким образом, проблема, кажется, запускается, когда я вставляю свои значения в мой сервер MySQL.Поэтому я подумал, что это мог быть мой набор символов, который был установлен на Latin1, и теперь я перешел на utf8 - UTF-8 Unicode

Другие факторы, касающиеся моей настройки MySQL: Iпытался использовать типы полей, такие как: varchar, varbinary (где я сейчас нахожусь) и текст длиной (256 на всех).У меня есть много полей столбцов в моей таблице, и многие из них должны быть зашифрованы, хотя я просто тестирую с 2, пока я все не выясню.

Так что глюк, с которым я столкнулсякогда я вставляю в базу данных и на самом деле смотрю на значение внутри своей базы данных, у меня есть значение символов, они равны ¥ ÄÎó¸LOI „˜: é0 (хотя я уверен, что транс-кодирование здесь изменит его)вставил скриншот фактического значения в базу данных здесь: alt text

Но когда я пытаюсь дешифровать значение, я ничего не получаю, и оно пустое.Кажется, что есть проблема с любым словом, которое начинается с заглавной буквы "G".если у меня есть строчная буква "g", то она, кажется, работает нормально ...

Я полностью озадачен этим и не знаю, как это устранить.

Любая помощь будет принята с благодарностью.PS.Мне также любопытно узнать, лучше ли использовать PHP AES_Encryption или лучше использовать MySQL AES_ENCRYPT?

Спасибо.

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

<?php

$connect = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
mysql_select_db(DB_NAME, $connect);

$fName = "Giesbrecht";

$encode = common::cleanUp($fName);
$encode = common::encryptMe($encode);
$encode = base64_encode($encode);

mysql_query("INSERT INTO contacts (userId, firstName, lastName) VALUES ('15', 'Justin', '".$encode."')") or die(mysql_error());

$results = mysql_query("SELECT * FROM contacts WHERE userId = '15'") 
or die(mysql_error());

while ($row = mysql_fetch_array($results)) 
{
    echo "<br />FN: ". $row['firstName'];
    echo "<br />LNE: ". $row['lastName'];   
    echo "<br />LN: ". common::decryptMe(base64_decode($row['lastName']));  
}

?>

1 Ответ

1 голос
/ 23 сентября 2010

Насколько я знаю, в PHP нет функции шифрования AES (есть сторонние реализации, и у mcrypt есть одна / обычно поставляется с PHP).

Большинство реализаций возвращает двоичное значение для зашифрованной строки (попробуйте кодирование / декодирование base64 перед вставкой / извлечением).

Когда я в последний раз смотрел на это более подробно (к счастью, некоторое время назад), mcrypt возвратил строку PHP, которая содержала фактическое зашифрованное значение в виде строки C (нулевое завершение). т. е. часто после этого значения в конце содержатся дополнительные символы.

НТН

C.

...